簡體   English   中英

解析XML文件在使用DOM的java中

[英]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附帶了一些成熟的框架,使解析生活更加輕松。 以下是我的偏好。 其他人可能會有所不同

  1. 如果您的XML結構已修復,您可以構建一些帶有JAXB注釋的pojos並使用它來讀取您的數據。 JAXB提供了填充XML值的完整對象層次結構。 此外,還提供了XML數據創建。

  2. 如果您不了解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。 您可以將XPathDOM文檔對象一起使用以處理全局搜索。

你已經使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM