簡體   English   中英

使用DOM解析XML文件(Java)

[英]Parsing XML file with DOM (Java)

我想解析以下網址: http : //eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi? db= nucleotide& id= 224589801

結果,我想出了以下方法:

public void parseXml2(String URL) {
    DOMParser parser = new DOMParser();

    try {
        parser.parse(new InputSource(new URL(URL).openStream()));
        Document doc = parser.getDocument();

        NodeList nodeList = doc.getElementsByTagName("Item");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node n = nodeList.item(i);
            Node actualNode = n.getFirstChild();
            if (actualNode != null) {
                System.out.println(actualNode.getNodeValue());
            }
        }

    } catch (SAXException ex) {
        Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
    }
}

使用這種方法,我可以獲取Item節點的值,但不能獲取其任何屬性。 我嘗試使用NamedNodeMap使用getAttribute()進行實驗,但仍然無濟於事。

  1. 為什么我必須要做n.getFirstChild().getNodeValue(); 獲得實際價值? n.getNodeValue()返回的只是null嗎? 這不是違反直覺的嗎?顯然,在我的情況下,節點沒有子節點?

  2. 是否有一些更健壯且廣為接受的使用DOM解析XML文件的方式? 我的文件最多不會有15-20行,因此SAX是不必要的(或者是?)

  1. XML標記包圍的文本值也被視為DOM中的Node。 這就是為什么必須在獲取值之前獲取文本Node的原因。 如果嘗試計算<Item>的節點數,則將看到只要有文本,就會有一個節點。

  2. XOM具有更直觀的界面,但沒有org.w3c.dom.*界面。

如果要使用內置解析器,則應查看http://www.java-samples.com/showtutorial.php?tutorialid=152

您嘗試使用的DOMParser是適當的,並且不可移植。

import java.io.IOException;
import java.net.URL;
import org.apache.xerces.parsers.DOMParser;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class XMLParser {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        parseXml2("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801");
    }

    public static void parseXml2(String URL) {
        DOMParser parser = new DOMParser();

        try {
            parser.parse(new InputSource(new URL(URL).openStream()));
            Document doc = parser.getDocument();

            NodeList nodeList = doc.getElementsByTagName("Item");
            for (int i = 0; i < nodeList.getLength(); i++) {
                System.out.print("Item "+(i+1));
                Node n = nodeList.item(i);
                NamedNodeMap m = n.getAttributes();
                System.out.print(" Name: "+m.getNamedItem("Name").getTextContent());
                System.out.print(" Type: "+m.getNamedItem("Type").getTextContent());
                Node actualNode = n.getFirstChild();
                if (actualNode != null) {
                    System.out.println(" "+actualNode.getNodeValue());
                } else {
                    System.out.println(" ");                    
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

完成示例代碼,並添加了幾行以獲取屬性。

盡管我認為您需要了解DOM的基本概念,但這應該可以幫助您入門。 網站(以及許多其他網站)可以為您提供幫助。 最重要的是了解其中存在的各種節點。

xml元素內的文本位於文本節點中,因為子元素可以與文本混合。 例如:

...
<A>blah<B/>blah</A>
...

元素A具有三個子元素:一個文本節點,元素B,另一個文本節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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