Разбор XML HttpResponse - PullRequest
       6

Разбор XML HttpResponse

10 голосов
/ 12 февраля 2011

Я пытаюсь проанализировать XML HttpResponse, который я получаю с HttpPost на сервер (last.fm), для приложения last.fm android.Если я просто проанализирую его в строку, я смогу увидеть, что это обычная строка 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 содержит правильную информацию.Что я делаю не так?

Ответы [ 3 ]

17 голосов
/ 12 февраля 2011

Я решил это.Для синтаксического анализатора 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();
             }
        }
1 голос
/ 12 февраля 2011

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

0 голосов
/ 12 февраля 2011

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

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

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

Вот правильный способ сравнения двух строк. Десять самых распространенных ошибок Java-программистов

...