我有一个XML,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<tns:myproject>
<tns:site name="London"/>
<tns:site name="Paris"/>
<tns:site name="New York"/>
<tns:node hostname="S1" IP="10.10.10.1" siteid="London">
<tns:elements>
<tns:database/>
</tns:elements>
</tns:node>
<tns:node hostname="S1" IP="10.10.10.2" siteid="London">
<tns:elements>
<tns:admin/>
</tns:elements>
</tns:node>
<tns:node hostname="S2" IP="10.10.10.3" siteid="Paris">
<tns:elements>
<tns:database/>
</tns:elements>
</tns:node>
<tns:node hostname="S2" IP="10.10.10.4" siteid="Paris">
<tns:elements>
<tns:admin/>
</tns:elements>
</tns:node>
<tns:node hostname="S3" IP="10.10.10.5" siteid="New York">
<tns:elements>
<tns:database/>
</tns:elements>
</tns:node>
<tns:node hostname="S3" IP="10.10.10.6" siteid="New York">
<tns:elements>
<tns:admin/>
</tns:elements>
</tns:node>
</tns:myproject>
如果database
中存在元素node
,我需要值hostname,IP和siteid。
预期产出:
hostname="S1" IP="10.10.10.1" siteid="London"
hostname="S2" IP="10.10.10.2" siteid="Paris"
hostname="S3" IP="10.10.10.3" siteid="New York"
我是xmllint的新手,所以我在unix中试过几个命令,比如
xpath project.xml "//@hostname"
或echo 'cat //@hostname' | xmllint --shell "topo.p.xml"
但不知道如何根据标记database
过滤它。
答案 0 :(得分:1)
基本上,您可以使用xpath谓词([]
)来过滤元素。 假设您的XML 没有涉及名称空间前缀,以下xpath将从具有后代元素{{1的hostname
元素获取<node>
属性}}:
<database>
由于您的实际XML 涉及前缀,您需要先声明名称空间前缀,可能是using stns
命令(我不是xmllint用户):
//node[elements/database]/@hostname
然后在xpath中使用已注册的前缀:
xmllint --shell project.xml
stns tns=uri.for.tns.here.according.to.your.xml