xmlstarlet:如果存在另一个值则查询一个值
xmlstarlet: query a value if another value is present
这是我的 xml file,我在其中尝试查询并打印 avtivebyDefault
设置为 true
的文件中所有 ID 的列表。
为此,我使用具有以下选项的 xmlstarlet sel
:
$ xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id pom.xml | sort -u
aaa
alto
bgpcep
bier
coe
controller
daexim
distribution
dlux
dluxapps
eman
faas
genius
groupbasedpolicy
honeycombvbd
infrautils
jsonrpc
l2switch
lispflowmapping
nemo
netconf
netvirt
neutron
nic
ocpplugin
odlparent
ofconfig
openflowplugin
ovsdb
p4plugin
packetcable
sfc
snmp
snmp4sdn
sxp
tsdr
unimgr
usc
vtn
vtnaaa
这里有两个问题,首先它会打印所有 id,即使它们被设置为 false
,其次通过将第一个和最后一个 id 打印在一起来打印连接(例如最后一行的 vtnaaa
的输出是不正确的)。我的查询中缺少什么?
尝试更改命令的这一部分:
-m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id
对此:
-m '/x:project/x:profiles/x:profile[x:activation/x:activeByDefault="true"]/x:id' -v .
要分隔值,请尝试使用 -n
作为换行符或将 -v 更改为 -v concat(.,' ')
作为 space。
示例...
$ xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m "/x:project/x:profiles/x:profile[x:activation/x:activeByDefault='true']/x:id" -v . -n pom.xml
aaa
alto
bgpcep
bier
coe
controller
daexim
distribution
dlux
dluxapps
genius
groupbasedpolicy
honeycombvbd
infrautils
jsonrpc
l2switch
lispflowmapping
nemo
netconf
netvirt
neutron
odlparent
ofconfig
openflowplugin
ovsdb
p4plugin
packetcable
sfc
snmp
snmp4sdn
sxp
tsdr
usc
vtn
这是我的 xml file,我在其中尝试查询并打印 avtivebyDefault
设置为 true
的文件中所有 ID 的列表。
为此,我使用具有以下选项的 xmlstarlet sel
:
$ xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id pom.xml | sort -u
aaa
alto
bgpcep
bier
coe
controller
daexim
distribution
dlux
dluxapps
eman
faas
genius
groupbasedpolicy
honeycombvbd
infrautils
jsonrpc
l2switch
lispflowmapping
nemo
netconf
netvirt
neutron
nic
ocpplugin
odlparent
ofconfig
openflowplugin
ovsdb
p4plugin
packetcable
sfc
snmp
snmp4sdn
sxp
tsdr
unimgr
usc
vtn
vtnaaa
这里有两个问题,首先它会打印所有 id,即使它们被设置为 false
,其次通过将第一个和最后一个 id 打印在一起来打印连接(例如最后一行的 vtnaaa
的输出是不正确的)。我的查询中缺少什么?
尝试更改命令的这一部分:
-m '/x:project/x:profiles/x:profile/x:activation[x:activeByDefault="true"]' -v /x:project/x:profiles/x:profile/x:id
对此:
-m '/x:project/x:profiles/x:profile[x:activation/x:activeByDefault="true"]/x:id' -v .
要分隔值,请尝试使用 -n
作为换行符或将 -v 更改为 -v concat(.,' ')
作为 space。
示例...
$ xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -m "/x:project/x:profiles/x:profile[x:activation/x:activeByDefault='true']/x:id" -v . -n pom.xml
aaa
alto
bgpcep
bier
coe
controller
daexim
distribution
dlux
dluxapps
genius
groupbasedpolicy
honeycombvbd
infrautils
jsonrpc
l2switch
lispflowmapping
nemo
netconf
netvirt
neutron
odlparent
ofconfig
openflowplugin
ovsdb
p4plugin
packetcable
sfc
snmp
snmp4sdn
sxp
tsdr
usc
vtn