我试图在Java中阅读下面的XML,但是由于XML中没有对称元素,无法读取 - 而且,我如何检查节点是否可用
这是XML -
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<node-path path="USA">
<property-name>Name</property-name>
<property-value><![CDATA[Cat A]]></property-value>
</node-path>
<node-path path="Canada">
<property-name>Name</property-name>
<property-value />
</node-path>
<node-path path="Australia">
<property-name>Name</property-name>
<json-counter>1</json-counter>
<json-property><![CDATA[Cat A]]></json-property>
<json-property><![CDATA[Cat B]]></json-property>
<json-property><![CDATA[Cat C]]></json-property>
<json-counter>2</json-counter>
<json-property><![CDATA[Cat D]]></json-property>
<json-property><![CDATA[Cat E]]></json-property>
<json-property><![CDATA[Cat F]]></json-property>
<property-value />
</node-path>
<node-path path="UK">
<property-name>Name</property-name>
<property-value><![CDATA[0]]></property-value>
</node-path>
</Root>`
这是我正在尝试的代码 -
try {
File inputFile = new File("c://test.xml");
DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList nListNodePath = doc.getElementsByTagName("node-path");
for (int i = 0; i < nListNodePath.getLength(); i++) {
Node nNodePath = nListNodePath.item(i);
if (nNodePath.getNodeType() == Node.ELEMENT_NODE) {
Element eElement1 = (Element) nNodePath;
System.out.println("Node Path--- : "+ eElement1.getAttribute("path"));
System.out.println("Property Name : " + eElement1.getElementsByTagName("property-name").item(0).getTextContent());
System.out.println("Property value : " + eElement1.getElementsByTagName("property-value").item(0).getTextContent());
System.out.println("Json Counter : " + eElement1.getElementsByTagName("json-counter").item(0).getTextContent());
System.out.println("JSON property : " + eElement1.getElementsByTagName("json-property").item(0).getTextContent());
}
}
答案 0 :(得分:0)
如何检查节点是否可用
getElementsByTagName()
返回NodeList
,其getLength()
方法会在找不到元素的情况下返回0
。
它还会为1
和json-counter
返回大于json-property
的值,因此硬编码item(0)
可能不是您应该做的。
此外,使用getElementsByTagName()
表示您无论位置如何都在提取元素,因此如果json-counter
和json-property
的混合序列具有含义,则无法使用{{ 1}}。
答案 1 :(得分:0)
您可以尝试使用Xpath工厂。您可以轻松地将节点转换为元素。
import javax.xml.xpath.XPathFactory;
.
.
.
XPath xpath = XPathFactory.newInstance().newXPath();
Node node = xpath.evaluate("/root/el1/el2[@attr='123']", yourDocOrNode, XPathConstants.NODE);
如果表达式无效,xpath.evaluate将抛出XPathExpressionException,如果找不到该元素,则返回null。