以下是我的xml文件的一部分
<?xml version="1.0" encoding="utf-8"?>
<osm generator="osmfilter 1.3A" version="0.6">
<node id="21295457" lat="53.4848139" lon="9.1540558" />
<node id="21316767" lat="53.0771599" lon="8.8030142" >
<tag k="bicycle" v="yes"/>
<tag k="highway" v="crossing"/>
<tag k="crossing" v="traffic_signals"/>
</node>
<node id="254069931" lat="48.9309975" lon="8.63482" >
<tag k="name" v="KV Ersingen Kirchbergsiedlung"/>
<tag k="power" v="substation"/>
</node>
<node id="254070051" lat="48.9277761" lon="8.6328671" >
<tag k="name" v="Umspannstation Ersingen Laierbergstraße"/>
<tag k="power" v="sub_station"/>
<tag k="operator" v="EnBW"/>
</node>
<node id="21929724" lat="54.8040971" lon="9.4346464" />
<node id="3444576256" lat="49.3993194" lon="11.0195838" >
<tag k="power" v="station"/>
</node>
<node id="3444576257" lat="49.4002323" lon="11.0183178" >
<tag k="power" v="station"/>
</node>
我想通过运行循环获取每个节点的属性id
,然后检查该节点是否有子节点tag
我已经使用以下代码实现了
xDoc = xmlread(path);
osmNode = xDoc.getDocumentElement;
nodes = osmNode.getElementsByTagName('node');
node_Matrix = zeros(nodes.getLength,3);
for i = 0 : nodes.getLength-1
node_IDs = nodes.item(i).getAttribute('id');
node_Matrix(i+1,1) = str2double(node_IDs);
if nodes.item(i).hasChildNodes
import javax.xml.xpath.*
factory = XPathFactory.newInstance();
xpath = factory.newXPath();
expression = xpath.compile('//osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]');
List = expression.evaluate(xDoc, XPathConstants.NODESET);
List.getLength;
end
end
现在,我想检查每个节点的子节点tag
是否具有属性v="substation
或v="sub_station
或v="station
而不循环遍历所有子节点。为此,我使用了xpath概念。但是,我需要一个xpath表达式,它不会给我所有的匹配,只是在当前循环迭代i
我已将部分node[i]
包含在我的xpath表达式//osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]
中
但这给了我所有的比赛。
我在这里失踪了什么?有人可以给我正确的表达吗?
提前致谢!
答案 0 :(得分:0)
您可以尝试使用相对于当前nodes.item(i)
的XPath,例如:
.....
expression = xpath.compile('self::*[tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]');
List = expression.evaluate(nodes.item(i), XPathConstants.NODESET);
List.getLength;