[英]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.