JAXP 和 StAX - DOM 节点表示为文档
JAXP and StAX - DOM Node is represented as Document
我想读取一个可能很大的 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>
在处理过程中,我想检查节点名称,如“way”或“relation”(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());
}
我的问题是提取的节点表示为文档而不是节点。这意味着我的调试输出显示:
#文件
#文档
#文档
每一行。
预期输出为 "node"、"way" 或 "relation"。
当我解析文件然后按照描述打印出节点时 here 它们被正确打印出来。
我是 StAX 的新手,DOM 所以任何提示都会很有帮助。
我正在使用 Mac OS X 10.10.2 和 Java 1.8.25.
嗯,首先,您的术语令人困惑。我认为当您说 "node" 时,您的意思是 "element node"。文档也是一个节点。
XSLT 转换的结果是一棵树,树总是以文档节点为根(在 XSLT 1.0 中,这简称为 "root node")。您会发现您要查找的元素节点是 document/root 节点的子节点。
变化:
System.out.println(domNode.getNodeName());
至:
System.out.println(((Document)domNode).getDocumentElement().getNodeName());
我想读取一个可能很大的 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>
在处理过程中,我想检查节点名称,如“way”或“relation”(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());
}
我的问题是提取的节点表示为文档而不是节点。这意味着我的调试输出显示:
#文件 #文档 #文档
每一行。 预期输出为 "node"、"way" 或 "relation"。
当我解析文件然后按照描述打印出节点时 here 它们被正确打印出来。
我是 StAX 的新手,DOM 所以任何提示都会很有帮助。
我正在使用 Mac OS X 10.10.2 和 Java 1.8.25.
嗯,首先,您的术语令人困惑。我认为当您说 "node" 时,您的意思是 "element node"。文档也是一个节点。
XSLT 转换的结果是一棵树,树总是以文档节点为根(在 XSLT 1.0 中,这简称为 "root node")。您会发现您要查找的元素节点是 document/root 节点的子节点。
变化:
System.out.println(domNode.getNodeName());
至:
System.out.println(((Document)domNode).getDocumentElement().getNodeName());