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
我有一个 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