【问题标题】:JAXP and StAX - DOM Node is represented as DocumentJAXP 和 StAX - DOM 节点表示为 Document
【发布时间】:2015-09-16 10:00:09
【问题描述】:

我想读取一个可能很大的 XML 文件。为了提高内存效率和易于处理,我想使用 StAX 和 DOM 的混合物,如 here 所述。

我的输入如下(OSM

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="CGImap 0.0.2">
 <bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
 <node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
 <node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05-03T13:39:23Z"/>
 <node id="1831881213" version="1" changeset="12370172" lat="54.0900666" lon="12.2539381" user="lafkor" uid="75625" visible="true" timestamp="2012-07-20T09:43:19Z">
  <tag k="name" v="Neu Broderstorf"/>
  <tag k="traffic_sign" v="city_limit"/>
 </node>
 ...
 <node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
 <way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
  <nd ref="292403538"/>
  <nd ref="298884289"/>
  ...
  <nd ref="261728686"/>
  <tag k="highway" v="unclassified"/>
  <tag k="name" v="Pastower Straße"/>
 </way>

在处理时我想检查节点名称,如“方式”或“关系”(like here)

我的代码如下:

    xsr.nextTag();
    while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {

        DOMResult result = new DOMResult();
        t.transform(new StAXSource(xsr), result);
        Node domNode = result.getNode();

        System.out.println(domNode.getNodeName());
    }

我的问题是提取的节点被表示为文档而不是节点。意思是我的调试输出显示:

#文档 #文档 #文档

对于每一行。 预期的输出将是“节点”、“方式”或“关系”。

当我解析文件然后按照here 的描述打印出节点时,它们会正确打印出来。

我是 StAX 和 DOM 的新手,所以任何提示都会非常有帮助。

我正在使用带有 Java 1.8.25 的 Mac OS X 10.10.2。

【问题讨论】:

    标签: java xml dom stax jaxp


    【解决方案1】:

    嗯,首先,您的术语令人困惑。我认为当您说“节点”时,您的意思是“元素节点”。文档也是一个节点。

    XSLT 转换的结果是一棵树,并且树总是以文档节点为根(在 XSLT 1.0 中,这被简单地称为“根节点”)。您将找到您正在寻找的元素节点作为文档/根节点的子节点。

    【讨论】:

      【解决方案2】:

      改变:

      System.out.println(domNode.getNodeName());
      

      到:

      System.out.println(((Document)domNode).getDocumentElement().getNodeName());
      

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 2011-05-12
        • 2011-05-30
        • 1970-01-01
        • 2015-05-20
        • 2012-12-05
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        相关资源
        最近更新 更多