2011-02-11 22 views
10

मैं एक HTML.tts एंड्रॉइड ऐप के लिए एक HttpPost से सर्वर (last.fm) पर प्राप्त XML HttpResponse को पार्स करने का प्रयास कर रहा हूं। अगर मैं इसे स्ट्रिंग करने के लिए बस पार्स करता हूं तो मैं सभी वांछित जानकारी के साथ एक सामान्य xml स्ट्रिंग देख सकता हूं। लेकिन मैं सिर्फ एक नाम ValuePairs पार्स नहीं कर सकता।एक एक्सएमएल HttpResponse पार्सिंग

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

मैं दो अलग बातें करने की कोशिश की है और उनमें से गैर काम किया: यह मेरा HttpResponse वस्तु है। सबसे पहले मैंने 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(); 
    } 
} 

इस कोड के बाद, नाम और प्लेकाउंट "खाली" रहता है।

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); 

मुझे एक पूर्ण एक्सएमएल स्ट्रिंग मिल जाएगी। इसलिए HttpResponse में सही जानकारी होने के बाद इसे पार्स करने में कोई समस्या नहीं होनी चाहिए। मैं क्या गलत कर रहा हूं?

उत्तर

17

लिया मैं इसे हल किया। डीओएम एक्सएमएल पार्सर को थोड़ा और समायोजन की आवश्यकता है:

 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

संबंधित मुद्दे