Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XMLEventReader而不是XMLStreamReader的StAX和DOM_Java_Dom_Stax - Fatal编程技术网

Java 使用XMLEventReader而不是XMLStreamReader的StAX和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

我想写一些基本上类似于 但是使用XMLEventReader而不是XMLStreamReader(在继续创建DOM之前,我需要能够检查一些元素的值)

有没有人能举一个最简单的例子来说明这一点?到目前为止,我所尝试的一切都会导致错误或空指针异常

谢谢! 爱洛

请查看:


它给出了一个很好的小示例,说明了如何使用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(如我添加到问题中的链接所示)。