2013-04-27 2 views
0

내가 XML 파일의 무리 형식으로 각 ... 내가 "R"을 각각의 문자열을 검색하고, 전체 요소를 반환해야검색에서, XML 전체 요소를 얻기는

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

이 결과 . 문제는 문자열에 새로운 줄이 있기 때문에 이전과 이후의 줄 수가 각 검색 결과마다 다를 수 있기 때문에 grep -B n -A n을 사용할 수 없습니다.

예를 들어, 주어진 경우 ... 나는 그때 얻을 필요가 "XYZ"에 대한 grep을 경우

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

... 나는 등 펄, egrep을, 같은 다른 도구를 사용하여 반대하고 있지 않다

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

... 달성하기 위해 이. 모든 도움이 크게 감사 할 것입니다.

답변

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 a.xml '//R[.//*[contains(text(),"xyz")]]' 

또는 광산과 같은 대안과

(이 사이트가 나에 링크하지 않습니다), XML::LibXML을 기반으로합니다 :

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

XML::XPath와 함께 제공되는 xpath 실행에 또 다른 옵션은 xmlstarlet입니다 :

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

PS :이 daxim의 대답은 단지 대안입니다. xml_grep2에 대해 알지 못했으며 즉시 설치하겠습니다! 요점은 여기서 XPath를 사용하는 것이 좋습니다.

+0

이러한 솔루션 중 하나를 사용할 수 없습니다. 어느 쪽도 결과를내는 것처럼 보이지 않습니다 ... 나야. – nvanwyen

관련 문제