我是XML解析的新手,需要一些帮助。假设一个像这样的xml:
<?xml version="1.0" encoding="UTF-8"?>
<top>
<node:config xmlns:node="uri:example.com/somepath/node/10.0" xmlns:this="uri:example.com/somepath/this/10.0" xmlns:that="uri:example.com/somepath/node/10.0" xmlns:thus="uri:example.com/somepath/thus/10.0" xmlns:an="uri:example.com/somepath/an/10.0">
<this:is.a.test>on</this:is.a.test>
<that:was.some.thing>off</that:was.some.thing>
<thus:can name="species" value="value1 value2">
<an:idea.for.something>on</an:idea.for.something>
<an:idea.for.something.else>on</an:idea.for.something.else>
</thus:can>
<thus:can name="monkey" value="value3 value4">
<an:idea.for.something>off</an:idea.for.something>
<an:idea.for.something.else>off</an:idea.for.something.else>
</thus:can>
</node:config>
</top>
当name = species和value = value1时,如何打印“so”命名空间内的所有内容?
谢谢!
答案 0 :(得分:0)
选择整个区块thus:can
:
xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can'
接下来只对那些具有属性name="species"
:
xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can[@name="species"]'
或某些地方有字符串&#34; value1&#34;在attrib value
:
xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can[contains(@value="value1"]'
结合了两个限制:
xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can[@name="species" and contains(@value,"value1")]'
请注意,当您的value=..
属性应该有明确定义的内部分隔符时,要避免匹配不需要的子字符串:
... value="apple grapefruit" ...
... value="monkey ape chimp" ...
然后搜索contains(@value,"ape")
这将匹配两个值(因为gr ape fruit包含 ape )。在之间添加一些分隔符,并在开始和结束时添加一些分隔符,例如冒号:
.... value=":apple:grapefruit:"
并搜索:
contains(@value,":ape:")
与该值不匹配,但仅与真实x:ape:y
匹配。