簡體   English   中英

Java中高效的XML解析| 與Java中的C#XmlDocument等效

[英]Efficient XML parsing in Java | Equivalent of C# XmlDocument in Java

下面是我的XML結構

<values>
<inputs>
 <input>one</input>
 <input>two</input>
</inputs>
<inputs>
 <input>one</input>
 <input>three</input>
</inputs>
</values>

目標:希望將所有輸​​入節點值放入集合中

我可以編寫SAX / DOM解析器,根據節點名稱進行讀取,並將每個值放入集合中。

那是最有效的方法嗎?

可以使用類似於C#中的XmlDocument的東西嗎?

謝謝 :)

這些天默認為。 我使用Stax(用於XML的流API) http://en.wikipedia.org/wiki/StAX

Stax解析是很好且高效的方法,但使用起來並不令人滿意。

要遍歷XML結構,可以使用下面的代碼等技術。

XMLEventReader reader = factory.createXMLEventReader(in);

while(reader.hasNext()) {
    XMLEvent e = reader.nextEvent();
    ... 
}

但是Stax解析的真正優勢在於可以確定XML結構是什么樣,而不必猜測下一個事件是什么(即,當您知道XML符合XSD時)。

嘗試使用JAXB。 如果您真的想要可擴展的東西,請使用JAXB的偵聽器功能(解組之前/之后),並將其與SAX解析器組合為內容處理程序。 這將使您的XML可以隨心所欲地變大而不會占用內存。 它只是通過一條流。

像這樣:

JAXBContext jc = ...
Unmarshaller u = jc.createUnmarshaller();
u.setListener(new Unmarshaller.Listener() {
    @Override
    public void beforeUnmarshal(Object target, Object parent) {
        if (target instanceof MyObj) {
            ...
        }
    }

    public void afterUnmarshal(Object target, Object parent) {
        if (target instanceof MyObj) {
            ...
        }
    }
};
BufferedInputStream stream = new BufferedInputStream(inputStream);

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
XMLReader reader = factory.newSAXParser().getXMLReader();
reader.setContentHandler(u.getUnmarshallerHandler());
reader.parse(new InputSource(stream));

//NOTE THIS CODE IS VERY ROUGH AND WONT COMPILE, BUT YOU SHOULD GET THE GIST

是。

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

是您需要的課程。

這是一個快速教程

但是,讓我們弄清楚。 基於SAX的解析器efficient :)基於XmlDocument類型的解析更加.... convinient :)

根據xml大小,您也可以使用Castor
從XSD可以生成映射類,並且在調用Castor的Unmarshal時
它將根據這些填充了xml內容的類生成一個復雜的對象。

暫無
暫無

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

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