这是我们目前解析输入请求XML的代码 -
public byte[] ipReq(byte[] inputRequestBytes) {
ByteArrayOutputStream byteArrayOutputStream = null;
try {
byteArrayInputStream = new ByteArrayInputStream(inputRequestBytes);
Document doc = documentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(byteArrayInputStream));
由于某些应用程序要求,我们希望能够在读取XML文档后解析XML文档,而不是直接以java.io.InputStream
处理XML源代码。如果有办法使用XMLStreamReader
,请建议我。这是我到目前为止的代码 -
public static XMLStreamReader getXMLReader(ByteArrayInputStream input) throws XMLStreamException{
XMLInputFactory xmlif = XMLInputFactory.newInstance();
xmlif.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
xmlif.setProperty("javax.xml.stream.supportDTD", false);
XMLStreamReader xmlr = xmlif.createXMLStreamReader(input,"UTF-8");
return xmlr;
}
应用程序将所需数据作为w3c文档,因此我希望能够仅使用Document API解析我使用XMLStreamReader
读取的XML数据。请建议一种方法。
答案 0 :(得分:0)
好吧,我真的没有得到你的要求,“我们希望能够在阅读之后解析XML文档”作为“阅读”文档已经暗示解析它,因为这是XMLStreamReader
做什么,它解析XML文件,但与DOM构建器不同,它不存储它。
现在,如果您有一个流阅读器,您可以使用其结果通过使用身份转换器来创建DOM树:
XMLInputFactory xmlif = XMLInputFactory.newInstance();
xmlif.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
xmlif.setProperty("javax.xml.stream.supportDTD", false);
XMLStreamReader xmlr = xmlif.createXMLStreamReader(input, "UTF-8");
// now use the stream reader for creating the DOM tree:
Source src=new StAXSource(xmlr);
DOMResult dst=new DOMResult();
TransformerFactory.newInstance().newTransformer().transform(src, dst);
Node node = dst.getNode(); // that’s the document node
如果目标是控制流阅读器及其选项,那就是要走的路。但是如果逐字逐句地提出要求,那就不是正确的事情,因为在读取XML文件之后它不会创建DOM树;它仍然在读取文件时与默认情况下(内部)DOM构建器没有太大区别。
流阅读器的主要属性是它不存储其结果,但会产生使用流阅读器的代码必须处理的事件。因此,如果您真的想在创建DOM树之前读取(并解析)整个文件,则需要为流读取器的结果创建临时存储,以便在完成后构建DOM树。
如果您不想重新发明轮子并实现自己的XML数据存储,最自然的解决方案是将DOM树用于中间存储。因此,逐字逐句地解决您的需求的奇怪但正式正确的解决方案是使用上面的代码,将生成的DOM节点视为临时存储,并在读取之后构建另一个DOM树:
src=new DOMSource(node);
DOMResult dst2=new DOMResult();
TransformerFactory.newInstance().newTransformer().transform(src, dst2);
Node finalResult = dst2.getNode(); // now we build a DOM tree *after* reading