2013-04-27 4 views
0

У меня есть куча файлов XML, каждый из которых имеет формат ...Получение XML весь элемент, из результатов поиска

<?xml version="1.0" encoding="UTF-8"?> 
<A> 
    <R> 
     <B></B> 
     <Q></Q> 
     <U></U> 
    </R> 
    ... 
</A> 

мне нужно искать строки в каждом, и вернуть весь элемент «R» , Проблема в том, что есть новые строки со строками, поэтому я не могу использовать grep -B n -A n, потому что количество строк до и после может отличаться для каждого результата поиска.

Например, учитывая следующее ...

<?xml version="1.0" encoding="UTF-8"?> 
<A> 
    <R> 
     <B>abc</B> 
     <Q>0123</Q> 
     <U>xyz</U> 
    </R> 
    <R> 
     <B> 
      qwe 
      rty 
      yui 
     </B> 
     <Q>0123</Q> 
     <U> 
      zxc 
      abc 
     </U> 
    </R> 
    <R> 
     <B>lkj</B> 
     <Q> 
      lkjhgfdsa 
      wer 
     </Q> 
     <U> 
      poixyz 
      zaq 
     </U> 
    </R> 
</A> 

Если я вычленить информацию «А», то мне нужно, чтобы получить ...

<R> 
    <B>abc</B> 
    <Q>0123</Q> 
    <U>xyz</U> 
</R> 
<R> 
    <B>lkj</B> 
    <Q> 
     lkjhgfdsa 
     wer 
    </Q> 
    <U> 
     poixyz 
     zaq 
    </U> 
</R> 

Я не против того, чтобы с помощью других инструментов, таких как Perl, и т.д. задать расширенный ... для достижения это. Любая помощь будет очень признательна.

ответ

1

Узнать XPath и использовать xml_grep2.

$ xml_grep2 -x '//*[text()[contains(string(.),"xyz")]]/ancestor::R' nvanwyen.xml 

<R> 
     <B>abc</B> 
     <Q>0123</Q> 
     <U>xyz</U> 
    </R> 
<R> 
     <B>lkj</B> 
     <Q> 
      lkjhgfdsa 
      wer 
     </Q> 
     <U> 
      poixyz 
      zaq 
     </U> 
    </R> 
+0

Это сработало ... Спасибо – nvanwyen

1

Да, это может быть сделано в Perl, например. с xpath исполняемый файл, который поставляется с XML::XPath:

xpath a.xml '//R[.//*[contains(text(),"xyz")]]' 

или альтернативы, такие как мой (этот сайт не позволит мне ссылку на него), который основан на XML::LibXML:

xpath-rp -e '//R[.//*[contains(text(),"xyz")]]' a.xml 

Другой вариант xmlstarlet:

xmlstarlet sel -t -c '//R[.//*[contains(text(),"xyz")]]' a.xml 

PS: это просто альтернативы ответа daxim в. Я не знал о xml_grep2, и я его установлю сразу! Главное, что здесь полезно использовать XPath.

+0

Я не могу заставить любое из этих решений работать. Кажется, что не получается никаких результатов ... должно быть, я. – nvanwyen

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