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