繁体   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