我能够按照下面的代码读取XML。
这是一个示例输入文件:
<explain>
<Query-Text>
</Query-Text>
<Plan>
<Node-Type></Node-Type>
<Startup-Cost></Startup-Cost>
<Total-Cost></Total-Cost>
<Actual-Total-Time></Actual-Total-Time>
<Actual-Rows></Actual-Rows>
<Actual-Loops></Actual-Loops>
<Plans>
<Plan>
<Node-Type></Node-Type>
<Startup-Cost></Startup-Cost>
<Total-Cost></Total-Cost>
<Actual-Rows></Actual-Rows>
<Actual-Loops></Actual-Loops>
</Plan>
</Plans>
</Plan>
</explain>
我只需要读取标签PLAN: "Total-Cost"
并从第一个PLAN
标签中"Actual-Total-Time"
信息。问题是内部层次结构中存在PLAN
,这也正在被读取。我怎么能只阅读第一个PLAN
标签,而不阅读里面我不感兴趣的标签?这是我的代码:
File fXmlFile = new File("/home/user1/Downloads/LOGT1.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("Plan");
for (int temp = 0; temp < nList.getLength(); temp++) {
//SAMPLE Node nNode = nList.item(temp);
System.out.println("nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode;
System.out.println("Total Cost query: " + eElement.getElementsByTagName("Total-Cost").item(0).getTextContent());
System.out.println("Actual Total Time query:" + eElement.getElementsByTagName("Actual-Total-Time").item(0).getTextContent());
}
此代码不会引发任何错误,但它不遵循所需的行为。
我想你正在寻找这样的东西:
for (int temp = 0; temp < nList.getLength(); temp++) { //SAMPLE
Node nNode = nList.item(temp);
if (nNode.getParent().getNodeName().equals("Plans")) {
continue;
}
System.out.println("nCurrent Element :" + nNode.getNodeName());
...
}
只需使用 XPath 即可获取值。下面的代码会给你你想要的:
XPath xPath = XPathFactory.newInstance().newXPath();
String Total_Cost = xPath.evaluate("//explain/Plan/Total-Cost/text()", doc).trim();
String Actual_Total_Time = xPath.evaluate("//explain/Plan/Actual-Total-Time/text()", doc).trim();