2016-07-20 6 views
2

Например, если:Как фильтровать несколько атрибутов в XMLStarlet?

<fruit> 
    <banana source='Ecuador' category='I'> 
     <quantity>1</quantity> 
    </banana> 
    <banana source='Costa Rica' category='I'> 
     <quantity>1</quantity> 
    </banana> 
</fruit> 

Скажем, я хочу, чтобы изменить

<banana source='Costa Rica' category='I'> 

в

<banana source='Costa Rica' category='II'> 

или его количество до 2, как бы я ссылаться на него, если я хочу, чтобы фильтровать как в исходном, так и в исходном значении категории?


Я пытаюсь сделать следующее:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' @category='I']/quantity" -v 2 

... но это приводит к синтаксической ошибке, как показано ниже:

Invalid predicate: /fruit/banana[@source='Ecuador' @category='I']/quantity 
Invalid expression: /fruit/banana[@source='Ecuador' @category='I']/quantity 
+0

Вы читали [документацию] (http://xmlstar.sourceforge.net /doc/xmlstarlet.pdf)? Вы пробовали какие-либо из параметров команды? Можете ли вы показать, что вы пробовали, и объяснить, что не сработало? –

+0

Да, я прочитал документацию, нашел ссылки и примеры только с одним атрибутом. Я пытался сделать что-то вроде: xmlstarlet ed -u "/ fruit/banana [@ source = 'Ecuador' @ category = 'I']/quantity" -v 2 example.xml Но это дает мне: Недопустимый предикат:/фрукты/банан [@ source = 'Ecuador' @ category = 'I']/количество Недопустимое выражение:/fruit/banana [@ source = 'Ecuador' @ category = 'I']/количество – EBM

+1

Should вероятно, будет помечен 'xpath'. –

ответ

2

После совсем немного проб и ошибка, достигли решения:

Мне нужно закрыть и снова открыть [] со следующим атрибутом. Например:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador'][@category='I']/quantity" -v 2 example.xml 

И будет правильно выход:

<?xml version="1.0"?> 
<fruit> 
    <banana source="Ecuador" category="I"> 
    <quantity>2</quantity> 
    </banana> 
    <banana source="Costa Rica" category="I"> 
    <quantity>1</quantity> 
    </banana> 
</fruit> 

Edit: также работает:

xmlstarlet ed -u "/fruit/banana[@source='Ecuador' and @category='I']/quantity" -v 2 example.xml 
+1

Это один подход, да. –

+1

... и вы только что нашли другой подход, который я собирался добавить в качестве отдельного ответа. :) –

+0

@CharlesDuffy Э-э, спасибо, хотя. – EBM

 Смежные вопросы

  • Нет связанных вопросов^_^