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

xmllint give attribute only if elements are present unix

我有一个 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 中,我需要值主机名、IP 和站点 ID。

预期输出:

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

基本上,您可以使用 xpath 谓词 ([]) 来过滤元素。 假设你的XML不涉及命名空间前缀,下面的xpath将从[=获取hostname属性15=] 元素具有后代元素 <database>:

//node[elements/database]/@hostname

因为你的实际 XML 有前缀 涉及你需要首先声明命名空间前缀,可能是 using stns 命令(我不是 xmllint 用户):

xmllint --shell project.xml
stns tns=uri.for.tns.here.according.to.your.xml

然后在你的 xpath 中使用注册的前缀:

//tns:node[tns:elements/tns:database]/@hostname