2010-09-22 33 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内容复杂的对象。