仅当元素存在时,xmllint才会给出属性unix

时间:2015-05-26 09:51:39

标签: xml unix xpath filter xmllint

我有一个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过滤它。

1 个答案:

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