2011-02-11 31 views
10

我想解析XML HttpResponse我从一个HttpPost到一个服务器(last.fm),为一个last.fm android应用程序。如果我简单地解析它的字符串,我可以看到它是一个普通的XML字符串,具有所有所需的信息。但我只是无法解析单个NameValuePairs。这是我的HttpResponse对象:解析一个XML 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(); 
    } 
} 

在此代码之后,name和playcount仍为“空”。所以我试图用一个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包含正确的信息。我究竟做错了什么?

回答

17

两者我解决它。 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

从源中解析XML时,这是非常好的tutorial。 你可以用它来构建需要解析XML提要更强大的应用程序 我希望它能帮助

0

如果(answer.get(I).getName()== “名”){

您不能使用==比较字符串

当我们使用==运算符时,实际上我们正在比较两个对象引用,以查看它们是否指向同一个对象。例如,我们无法使用==运算符比较两个字符串是否相等。我们必须使用.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

+0

是的。你是对的。我改变了它,但它但两个变量仍然保留“空” – gaussd 2011-02-11 22:21:38