2013-04-27 54 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> 

如果我用grep爲 「XYZ」,那麼我需要......

<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,egrep的,等...完成這個。任何和所有的幫助將不勝感激。

回答

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 2013-04-28 00:29:52

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 2013-04-27 19:01:19