如何通过单个XPath表达式选择某些孩子的所有属性?

时间:2016-03-29 23:10:11

标签: xml matlab xpath attributes

我的XML格式如下

<node id="7463888842" lat="6666" lon="66666" version="6">
    <tag k="power" v="substation"/>
    <tag k="voltage" v="20000"/>
    <tag k="building" v="transformer_tower"/>
    <tag k="substation" v="minor_distribution"/>
</node>
<node id="277852742" lat="6766" lon="666676" version="6">
    <tag k="ref" v="64268"/>
    <tag k="name" v="Hambergen Sandstraße"/>
    <tag k="power" v="substation"/>
    <tag k="voltage" v="20000"/>
    <tag k="location" v="kiosk"/>
    <tag k="operator" v="EWE"/>
    <tag k="frequency" v="50"/>
    <tag k="substation" v="minor_distribution"/>
</node>
<node id="274965842" lat="66" lon="666" version="6"/>
<node id="2732132642" lat="666" lon="6666" version="6"/>
<node id="274454552" lat="6" lon="6.6" version="6"">
    <tag k="power" v="substation"/>
</node>

我只需要那些具有属性k="power" v="substation"的节点,如果这是匹配,我需要所有其他属性(即同一节点中的k="_something_" and v="_something_"

对于第一部分(找出k="power" v="substation"的所有节点,我使用了这个XPath表达式

expression1sub = xpath.compile('self::*[tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]');

并使用此

进行检查
List = expression1sub.evaluate(nodes.item(i), XPathConstants.BOOLEAN);

现在我检查List是否为真,如果是,我需要所有标签中的所有其他属性。

例如:对于第一个节点,因为标签k="power" v="substation"存在,我需要所有其他属性(即。voltage 20000, building, transformer_tower, substation, minor_distribution)。

如果我可以在MATLAB中使用单个XPath表达式实现此目的,请告诉我。

我尝试使用此XPath

self::*[tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]/tag[@*]

但遗憾的是它不起作用。

1 个答案:

答案 0 :(得分:2)

此XPath将为包含query()元素的tag node元素下的tag元素选择所有属性值:<{1}}和@k='power'

@k='substation'

对于您的示例XML,它返回:

//node[tag[@k='power' and @v='substation']]/tag/@*

或者,如果您想使用power substation voltage 20000 building transformer_tower substation minor_distribution ref 64268 name Hambergen Sandstraße power substation voltage 20000 location kiosk operator EWE frequency 50 substation minor_distribution power substation tag排除@k='power'

@k='substation'

对于您的示例XML,它返回:

//node[tag[@k='power' and @v='substation']]/tag[not(@k='power' and @v='substation')]/@*

请注意,两个XPath表达式(实际上是任何XPath表达式)都假定XML的单个根元素。