【发布时间】:2015-11-19 02:50:07
【问题描述】:
以下是我的 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>
我想通过运行一个循环然后检查该节点是否有子节点tag来获取每个节点的属性id
这是我使用以下代码实现的
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
我在我的 xpath 表达式 //osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]] 中包含了 node[i] 部分
但这给了我所有的比赛。
我在这里想念什么?谁能给我正确的表达方式?
提前致谢!
【问题讨论】:
标签: xml matlab xpath xml-parsing