Разбор XML-HttpResponse

Я пытаюсь проанализировать XML HttpResponse, который я получаю из HttpPost на сервер (last.fm), для приложения Android last.fm. Если я просто разбираю его на строку, я вижу, что это нормальная строка xml со всей необходимой информацией. Но я просто не могу разобрать сингл NameValuePairs. Это мой объект HttpResponse:

HttpResponse response = client.execute(post);
HttpEntity r_entity = response.getEntity();

Я пробовал две разные вещи, и не из них работали. Сначала я попытался найти NameValuePairs:

List<NameValuePair> answer = URLEncodedUtils.parse(r_entity);
String name = "empty";
String playcount = "empty";
for (int i = 0; i < answer.size(); i++){
   if (answer.get(i).getName().equals("name")){
      name = answer.get(i).getValue();
   } else if (answer.get(i).getName().equals("playcount")){
      playcount = answer.get(i).getValue();
   }
}

После этого кода имя и проигрывание остаются "пустыми". Поэтому я попытался использовать XML-парсер:

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document answer = db.parse(new DataInputStream(r_entity.getContent()));
NodeList nl = answer.getElementsByTagName("playcount");
String playcount = "empty";
for (int i = 0; i < nl.getLength(); i++) {
   Node n = nl.item(i);
   Node fc = n.getFirstChild();
   playcount Url = fc.getNodeValue();
}

Кажется, что это происходит намного раньше, так как даже не позволяет установить переменную playcount. Но, как я сказал, если я это сделаю:

EntityUtils.toString(r_entity);

Я получу идеальную строку xml. Таким образом, не должно возникать никаких проблем с этим, поскольку HttpResponse содержит правильную информацию. Что я делаю неправильно?

Ответ 1

Я решил это. Парсер DOM XML нуждался в дополнительной настройке:

        HttpResponse response = client.execute(post);
        HttpEntity r_entity = response.getEntity();
        String xmlString = EntityUtils.toString(r_entity);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = factory.newDocumentBuilder();
        InputSource inStream = new InputSource();
        inStream.setCharacterStream(new StringReader(xmlString));
        Document doc = db.parse(inStream);  

        String playcount = "empty";
        NodeList nl = doc.getElementsByTagName("playcount");
        for(int i = 0; i < nl.getLength(); i++) {
            if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
                 org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i);
                 playcount = nameElement.getFirstChild().getNodeValue().trim();
             }
        }

Ответ 2

Это очень хороший учебник по разбору XML из фида. Вы можете использовать его для создания более надежных приложений, которые должны анализировать XML-каналы Я надеюсь, что это поможет

Ответ 3

if (answer.get(i).getName() == "name" ) {

Вы не можете использовать == для сравнения строки

Когда мы используем оператор ==, мы фактически сравниваем две ссылки на объекты, чтобы увидеть, указывают ли они на один и тот же объект. Мы не можем сравнивать, например, две строки для равенства, используя оператор ==. Вместо этого мы должны использовать метод .equals, который является методом, унаследованным всеми классами из java.lang.Object.

Здесь правильный способ сравнения двух строк.

 String abc = "abc"; String def = "def";

// Bad way
if ( (abc + def) == "abcdef" )
 {
   ......
 }
 // Good way
 if ( (abc + def).equals("abcdef") )
 {
  .....
 }

Взято из Десять ошибок Программисты Java делают