【问题标题】:Parsing a XML HttpResponse解析 XML HttpResponse
【发布时间】:2011-06-25 20:47:02
【问题描述】:

我正在尝试解析从 HttpPost 到服务器 (last.fm) 的 XML HttpResponse,用于 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 Parser:

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 包含正确的信息。我做错了什么?

【问题讨论】:

    标签: android xml parsing http-post 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】:

      这是一个非常好的tutorial 从提要解析 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") )
         {
          .....
         }
        

        取自Top Ten Errors Java Programmers Make

        【讨论】:

        • 是的。你说得对。我更改了它,但两个变量仍然“空”
        猜你喜欢
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2019-02-21
        • 2012-07-05
        • 1970-01-01
        • 2011-02-20
        • 2014-02-20
        • 1970-01-01
        相关资源
        最近更新 更多