2016-01-29 4 views
0

Я действительно новичок в разборе XML и нуждаюсь в некоторой помощи. Предположим, что XML, такие как этот:Анализ xml с xmlstarlet

<?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> 

Как бы я идти о печати все внутри пространства имен «таким образом», когда имя = вид и значение = value1, например?

Спасибо!

ответ

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"]' 

Или те, которые где-то есть строка "value1" в 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") это будет соответствовать оба значению (потому что гр ape фрукты содержит ape). Добавьте некоторые разделители между, а также в начале плюс конец, например. двоеточие:

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

и поиск с:

contains(@value,":ape:") 

не соответствует этому значению, но только реальный x:ape:y.