[英]Parsing XML file In java using DOM
我想解析XML文件以讀取文件中某些元素的值。
<row>
<element>
<status>OK</status>
<duration>
<value>499</value>
<text>8 mins</text>
</duration>
<distance>
<value>3208</value>
<text>3.2 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>501</value>
<text>8 mins</text>
</duration>
<distance>
<value>2869</value>
<text>2.9 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>788</value>
<text>13 mins</text>
</duration>
<distance>
<value>6718</value>
<text>6.7 km</text>
</distance>
</element>
</row>
我希望能夠讀取“距離”標簽下所有“值”標簽的值。 我已經完成了讀取XML數據的基本代碼。 我只是想在第三級讀取元素的值
簡單的DOM解析不再是恕我直言的首選方式。 Java附帶了一些成熟的框架,使解析生活更加輕松。 以下是我的偏好。 其他人可能會有所不同
如果您的XML結構已修復,您可以構建一些帶有JAXB注釋的pojos並使用它來讀取您的數據。 JAXB提供了填充XML值的完整對象層次結構。 此外,還提供了XML數據創建。
如果您不了解XML數據的結構或者您流式傳輸XML數據,那么可能需要進行STAX解析。
無論如何,這些框架會帶來很多問題,例如文件編碼,語法檢查,類型安全(JAXB),....
如果您想使用DOM解析,那么您可以使用XPath顯着縮短您的請求:
XPath xPath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(ParseUsingXPath.class.getResourceAsStream("data.xml"));
NodeList list = (NodeList) xPath.evaluate("/row/element/distance/value", source, XPathConstants.NODESET);
for (int i=0;i<list.getLength();i++) {
System.out.println(list.item(i).getTextContent());
}
它輸出:
3208
2869
6718
在這里,我直接將XML用作文件中的StringStream。 您可以將XPath與DOM文檔對象一起使用以處理全局搜索。
你已經使用xml的xsd定義? 使用this和jaxb,您可以輕松地將xml解組為java對象。
下面的代碼可能會幫助您訪問value
元素。
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class DOMParsarDemo {
protected DocumentBuilder docBuilder;
protected Element root;
public DOMParsarDemo() throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
docBuilder = dbf.newDocumentBuilder();
}
public void parse(String file) throws Exception {
Document doc = docBuilder.parse(new FileInputStream(file));
root = doc.getDocumentElement();
System.out.println("root element is :" + root.getNodeName());
}
public void printAllElements() throws Exception {
printElement(root);
}
public void printElement(Node node) {
if (node.getNodeType() != Node.TEXT_NODE) {
Node child = node.getFirstChild();
while (child != null) {
if (node.getNodeName().equals("distance")) {
if (child.getNodeName().equals("value")) {
System.out.println(child.getFirstChild().getNodeValue());
}
}
printElement(child);
child = child.getNextSibling();
}
}
}
public static void main(String args[]) throws Exception {
DOMParsarDemo demo = new DOMParsarDemo();
demo.parse("resources/abc.xml");
demo.printAllElements();
}
}
輸出:
root element is :row
3208
2869
6718
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.