使用xmlstarlet解析xml

时间:2016-01-29 22:42:58

标签: xml xmlstarlet

我是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”命名空间内的所有内容?

谢谢!

1 个答案:

答案 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匹配。