我的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[@*]
但遗憾的是它不起作用。
答案 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的单个根元素。