我在Activity中使用XML DOM Parser,它必须使用CDATA值解析XML。使用纯XML,DOM Parser工作得非常好,但是当数据包含CDATA值时,它不起作用。
我需要解析的XML文件就像:
<?xml version="1.0" encoding="utf-8"?>
<organizations>
<organization>
<name><![CDATA[Center for Maximum]]></name>
<image><![CDATA[https://www.xyz.com/company_placeholder.png]]></image>
<city><![CDATA[Austin]]></city>
<state><![CDATA[Texas]]></state>
</organization>
</organizations>
我已将setCoalescing(true)
添加到我的DocumentBuilderFactory
对象中,但即使这样,它也无法正确解析。它给出了错误java.net.MalformedURLException: Protocol not found:
。提前谢谢。
答案 0 :(得分:4)
我找到这个问题的唯一解决方案是使用XPATH解析各种项目值。例如,如果我们需要解析上面XML代码中的“name”项,那么我们需要执行以下操作:
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(url); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
XPath xPath = XPathFactory.newInstance().newXPath();
String name = null;
try {
name=xPath.evaluate("//organization/name/text()", doc).trim();
}
catch (XPathExpressionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
现在,字符串name
具有项“name”的所需值。这是我在我的代码中用于解析CDATA的工作。希望这会有所帮助。
答案 1 :(得分:1)
我在Activity中使用XML DOM Parser,它必须使用CDATA值解析XML。要解析CDATA内容,您可以在元素上尝试getTextContent,然后您就可以在CDATA标记内获取数据。
NodeList nodeListGetName = doc.getElementsByTagName("name");
Element eleName = (Element) nodeListGetName.item(0);
String strName = eleName.getTextContent();
在上面的代码中,我解析了<name>
节点的数据。您可以使用相同的模式进行其他CDATA内容解析。