2010-09-22 60 views
0

C#的XmlDocument的等效下面是我的XML結構Java中高效的XML解析|在Java中

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

目標:希望把所有輸入節點的值到一個集合

我可以寫SAX/DOM解析器讀取基礎上,節點名稱並將每個值放入集合中。

這是最有效的方法嗎?

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

謝謝:)

+0

什麼是我們XML內容的大小?對於小文件,使用DOM。否則SAX。 – Jayan 2010-09-22 06:55:35

+0

'XmlDocument'對我來說看起來非常低效,它是一個DOM模型。 – skaffman 2010-10-13 10:35:08

回答

0

是的。

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

是您需要的類。

這是一個快速的tutorial

但讓我們來看看它。基於SAX的解析器更多efficient :) XmlDocument基於類型的解析更多.... convinient。 :)

1

嘗試使用JAXB。如果你想要真正可伸縮的東西,可以使用JAXB的監聽器功能(unmarshall之前/之後),並使用SAX Parser作爲內容處理器。 這將允許您的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 
+0

我期望stax可以同樣高效但使用起來更舒適 – Yoni 2010-09-22 05:33:15

2

默認情況下,這些天。我使用Stax(用於XML的Streaming API)http://en.wikipedia.org/wiki/StAX

Stax解析非常好,而且效率很高,但它的使用並不令人愉快。

遍歷XML結構,你可以使用如下代碼技術...

XMLEventReader reader = factory.createXMLEventReader(in); 

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

但斯塔克斯解析真正的實力來的時候你可以肯定的XML結構是什麼樣的,你不需要猜測下一個事件會是什麼(例如,當你知道XML符合XSD時)。

+0

我想我應該補充一點,stax實現可以在Java Web服務開發包JWSP中找到。 – Dunderklumpen 2010-09-22 05:36:58

0

依賴於XML的大小,你也可以Castor
使用從XSD可以生成映射類,當你調用Castor的解組
將基於這些類填充XML內容複雜的對象。