2016-01-29 78 views
0

我對XML解析非常陌生,需要一些幫助。假設一個XML像這樣的:用xmlstarlet解析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> 

我怎麼會去的「從而」命名空間內打印的一切,當名=種類和價值=值例如?

謝謝!

回答

0

選擇整個塊thus:can

xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can' 

下一步細化,只有那些具有ATTRIB name="species"

xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can[@name="species"]' 

或者那些地方有字符串 「值1」 中的ATTRIB value

xmlstarlet sel -N thus="uri:example.com/somepath/thus/10.0" -t -c '//thus:can[contains(@value="value1"]' 

而2限制措施:

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果實含有)。在開始和結束之間添加一些分隔符,例如冒號:

.... value=":apple:grapefruit:" 

和搜索用:

contains(@value,":ape:") 

不匹配的價值,但只有真正的x:ape:y