2011-11-19 88 views
3

我解析服务器上的XML我读它并解析它没有任何错误但我无法看到数据。在android中解析CDATA

这里是我的XML:

<BookData><book><Title><![CDATA[ABC]]></Title><AuthorFName1><![CDATA[A]]></AuthorFName1><AuthorLName1><![CDATA[B]]></AuthorLName1></book><book><Title><![CDATA[XYZ]]></Title><AuthorFName1><![CDATA[A]]></AuthorFName1><AuthorLName1><![CDATA[B]]></AuthorLName1></book> 

我使用DocumentBuilderFactory看到连我设置

dbf.setCoalescing(true); 

但仍无法正常工作,请参阅的DocumentBuilderFactory

Document doc = null; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setCoalescing(true); 
try { 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    InputSource is = new InputSource(); 
    is.setCharacterStream(new StringReader(xml)); 
    doc = db.parse(is); 
} catch (ParserConfigurationException e) { 
    Log.d("XML parse Error:", e.getMessage()); 
    return null; 
} catch (SAXException e) { 
    Log.d("Wrong XML File Structure", e.getMessage()); 
    return null; 
} catch (IOException e) { 
    Log.d("IOException", e.getMessage()); 
    return null; 
} 
+0

在StackOverflow上有很多类似的问题。 http://stackoverflow.com/search?q=parse+cdata+in+android –

+0

请在这里更新你的xml,因为这个xml不是正确的。所以,所有未来的用户都可以从这个答案中获益。 –

+0

更新.............. –

回答

4
代码的代码

试试这个,你只需要将InputSource实例传递给这个方法就行了。

private void DOMParser(InputSource inputSource) { 

     DocumentBuilderFactory dBuilderFactory = DocumentBuilderFactory.newInstance(); 
     try { 
      DocumentBuilder documentBuilder = dBuilderFactory.newDocumentBuilder(); 
      Document dom = documentBuilder.parse(inputSource); 

      // get the root element..... 
      Element docElement = dom.getDocumentElement(); 
      Log.i("Root Element", docElement.getTagName()); 

      // now get the NodeList of root elements 
      NodeList nodeList = docElement.getElementsByTagName("book"); 
      Log.i("NodeList Length", nodeList.getLength()+""); 
      for (int i = 0; i < nodeList.getLength(); i++) { 

       Element eleBook = (Element) nodeList.item(i); 
       Log.i("Book Node", eleBook.getTagName()); 

       NodeList titleNode = eleBook.getElementsByTagName("Title"); 
       Element TitleEle = (Element) titleNode.item(0); 
       Log.i("Title", "Title - "+TitleEle.getFirstChild().getNodeValue()); 

       NodeList AuthorFName1Node = eleBook.getElementsByTagName("AuthorFName1"); 
       Element AuthorFName1Ele = (Element) AuthorFName1Node.item(0); 
       Log.i("AuthorFName1","AuthorFName1 - "+AuthorFName1Ele.getFirstChild().getNodeValue()); 

       NodeList AuthorFName11Node = eleBook.getElementsByTagName("AuthorLName1"); 
       Element AuthorFName11Ele = (Element) AuthorFName11Node.item(0); 
       Log.i("AuthorLName1","AuthorLName1 - "+AuthorFName11Ele.getFirstChild().getNodeValue()); 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

感谢您的答案,但它在服务器上的打字错误没有拼写错误。这是我的打字错误。请建议我如何解析CDATA –

+0

现在你可以尝试自己我也猜想有StackOverflow好友已经存在的问题已经丢失.. –

+0

而且,如果你不能解析XML你应该提供的问题是什么是确切的问题你正面临着。 –

6

这是样本XML:

<?xml version="1.1" encoding="utf-8"?> 
<sample> 
    <artists> 
     <artist> 
      <artistname><![CDATA[+&&&Plus]]></artistname> 
     </artist> 
     <artist> 
      <artistname>015B</artistname>   
     </artist> 
    </artists> 
</sample> 

比方说,你已经在XML文件内容的xmlString,下面的方法将解析XML有或无CDATA标签:

private static final String XML_TAG = "artist"; 
    private Object parseXML(String xmlString) throws Exception { 
    try { 
     Document doc = getDomElement(xmlString); 
     NodeList nodes = doc.getElementsByTagName(XML_TAG); 
     return retrieveData(doc,nodes); 
    } catch (Exception e) { 
     //Logger.logError(e); 
     throw e; 
    } 
} 

static public Document getDomElement(String xmlString) throws ParserConfigurationException, SAXException, IOException { 
    Document doc = null; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

    DocumentBuilder db = dbf.newDocumentBuilder(); 
    InputSource is = new InputSource(); 
    is.setCharacterStream(new StringReader(xmlString)); 
    doc = db.parse(is); 


    return doc; 
} 


private Object retrieveData(Document doc, NodeList nodes) { 
    ArrayList<String> list = new ArrayList<String>(); 
    for(int i = 0 ; i < nodes.getLength() ; i++) { 
     Element element = (Element) nodes.item(i); 
     String name = getValue(element, "artistname"); 
     list.add(name); 
    } 
    return list; 
} 

static public String getValue(Element item, String str) { 
    NodeList n = item.getElementsByTagName(str); 
    return getElementValue(n.item(0)); 
} 

static public final String getElementValue(Node elem) { 
    try { 
     Node child; 
     if(elem != null){ 
      if (elem.hasChildNodes()){ 
       for(child = elem.getFirstChild(); child != null; child = child.getNextSibling()){ 
        if(child.getNodeType() == Node.CDATA_SECTION_NODE 
          || child.getNodeType() == Node.TEXT_NODE) 
        { 
         return child.getNodeValue().trim(); 
        } 
       } 
      } 
     } 
     return ""; 
    } catch (DOMException e) { 
     //Logger.logError(e); 
     return ""; 
    } 
} 
+0

+1帮助我很好的回答:) –