gpt4 book ai didi

java - 使用 XMLStreamReader API 读取 W3C 文档后解析它

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:27 25 4
gpt4 key购买 nike

这是我们当前用于解析输入请求 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 进行处理。如果有办法使用 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 文档所需的数据,因此我希望能够仅使用文档 API 来解析使用 XMLStreamReader 读取的 XML 数据。请建议一种方法来做到这一点。

最佳答案

嗯,我真的不明白你的要求,“我们希望能够仅在阅读后解析 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

关于java - 使用 XMLStreamReader API 读取 W3C 文档后解析它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21182217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com