在android中解析CDATA
我解析服务器上的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;
}
试试这个,你只需要将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();
}
}
感谢您的答案,但它在服务器上的打字错误没有拼写错误。这是我的打字错误。请建议我如何解析CDATA –
现在你可以尝试自己我也猜想有*好友已经存在的问题已经丢失.. –
而且,如果你不能解析XML你应该提供的问题是什么是确切的问题你正面临着。 –
这是样本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 "";
}
}
+1帮助我很好的回答:) –
在*上有很多类似的问题。 http://*.com/search?q=parse+cdata+in+android –
请在这里更新你的xml,因为这个xml不是正确的。所以,所有未来的用户都可以从这个答案中获益。 –
更新.............. –