matlab

时间:2015-11-19 02:50:08

标签: xml matlab xpath xml-parsing

以下是我的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="substationv="sub_stationv="station而不循环遍历所有子节点。为此,我使用了xpath概念。但是,我需要一个xpath表达式,它不会给我所有的匹配,只是在当前循环迭代i

内的匹配(如果存在)

我已将部分node[i]包含在我的xpath表达式//osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]中 但这给了我所有的比赛。 我在这里失踪了什么?有人可以给我正确的表达吗?

提前致谢!

1 个答案:

答案 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;