Java 使用XMLEventReader而不是XMLStreamReader的StAX和DOM
我想写一些基本上类似于 但是使用XMLEventReader而不是XMLStreamReader(在继续创建DOM之前,我需要能够检查一些元素的值) 有没有人能举一个最简单的例子来说明这一点?到目前为止,我所尝试的一切都会导致错误或空指针异常 谢谢! 爱洛请查看:Java 使用XMLEventReader而不是XMLStreamReader的StAX和DOM,java,dom,stax,Java,Dom,Stax,我想写一些基本上类似于 但是使用XMLEventReader而不是XMLStreamReader(在继续创建DOM之前,我需要能够检查一些元素的值) 有没有人能举一个最简单的例子来说明这一点?到目前为止,我所尝试的一切都会导致错误或空指针异常 谢谢! 爱洛请查看: 它给出了一个很好的小示例,说明了如何使用xml流媒体和XMLEventReader。我也遇到了同样的问题,就我所能调试的情况而言,所有这些都表明JDK(至少在build 1.8.0¢-b12上)中存在缺陷,更具体地说是在类com.su
它给出了一个很好的小示例,说明了如何使用xml流媒体和XMLEventReader。我也遇到了同样的问题,就我所能调试的情况而言,所有这些都表明JDK(至少在build 1.8.0¢-b12上)中存在缺陷,更具体地说是在类
com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX
中
NPE实际上只是另一个bug的结果,它与这个类的bridge()
方法中如何处理读取器有关。如果读卡器未处于START\u文档
状态,则仅在第一次使用nextEvent()
查看下一个事件,而不会提前查看。这导致第一个START\u元素
事件被处理两次。如果使用StreamResult
而不是DOMResult
,则可以很好地观察到这一点。在那里,NPE不会发生,但是结果流中生成的XML将包含第一个元素的标记的开始两次
我现在尝试使用一个接收DOMResult
的xmleventwitter
来解决这个问题。因此,基本上模拟了转换器的功能,将每个读取事件直接推送到该写入程序。如果我成功了,我也会在这里发布我的解决方案
PS:我想在JDK上报告这个问题,甚至最终推出一个潜在的解决方案。如果有人能告诉我应该怎么做,我将非常感激
更新:
因此,我设法用上述方法解决了这个问题。根据中建议的代码,您可以使用以下方法,而不是使用变压器
:
private Node readToNode(final XMLEventReader reader) throws XMLStreamException, ParserConfigurationException {
XMLEvent event = reader.peek();
if (!event.isStartElement()) {
throw new IllegalArgumentException("reader must be on START_ELEMENT event");
}
final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
final XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(new DOMResult(document));
int depth = 0;
do {
event = reader.nextEvent();
writer.add(event);
if (event.isStartElement()) {
depth++;
} else if (event.isEndElement()) {
depth--;
}
} while (reader.hasNext() && !(event.isEndElement() && depth <= 0));
return document.getDocumentElement();
}
私有节点readToNode(最终XMLEventReader读取器)抛出XMLStreamException、ParserConfiguration异常{
XMLEvent事件=reader.peek();
如果(!event.isStartElement()){
抛出新的IllegalArgumentException(“读卡器必须在开始元素事件上”);
}
最终文档文档=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
最终XMLEventWriter writer=XMLOutputFactory.newInstance().createXMLEventWriter(新的DOMResult(文档));
int深度=0;
做{
event=reader.nextEvent();
writer.add(事件);
if(event.isStartElement()){
深度++;
}else if(event.isEndElement()){
深度--;
}
}while(reader.hasNext()&&!(event.isEndElement()&&depth,谢谢。资源很好。我的问题实际上是从EventReader创建DOM结构。我可以使用xmlStreamReader和xmlEventReader很好地读取文件,但只能从StreamReader创建DOM(如我添加到问题中的链接所示)。