xml_grep 요소를 포함하는 요소 제외

xml_grep 요소를 포함하는 요소 제외

특정 다른 요소가 포함된 XML 파일에서 모든 요소를 ​​제거하려고 합니다. 다음은 제가 하려는 작업의 매우 단순화된 버전입니다. XML 파일이 있다고 가정합니다.

<RootEl>
   <A>
      <B/>
   </A>
   <A>
      <C/>
   </A>
 </RootEl>

B를 포함하는 A만 모두 유지하려면 다음 명령줄을 사용할 수 있습니다.

xml_grep -root A -cond B < TheFile.xml

그러나 반대로 B를 포함하지 않는 A만 유지하고 싶다면 당황하게 됩니다. 위와 유사한 명령, 즉

xml_grep -root A -exclude B < TheFile.xml

나에게 준다

<RootEl>
   <A>

   </A>
   <A>
      <C/>
   </A>
 </RootEl>

반면에 내가 원하는 것은

<RootEl>
   <A>
      <C/>
   </A>
 </RootEl>

다음을 사용하면 동일한 원하지 않는 답변을 얻습니다.

xml_grep -root A -exclude A/B < TheFile.xml

또는

xml_grep -exclude A/B < TheFile.xml

저는 Python에서 이 작업을 수행하는 방법을 알아낼 수 있었고 xslt에서도 가능하다고 생각합니다. 하지만 나는 xml_grep에서 이 작업을 수행할 수 있는 방법을 원했습니다.

그런데, 왜 C가 포함된 As를 원한다고 말하지 않는지 누군가가 물을 것이라고 확신합니다. 문제는 A가 B나 C 외에 포함할 수 있는 항목이 20개 정도 있다는 것입니다. 따라서 C, D 또는...또는 Z를 포함하는 A를 지정해야 합니다. 이는 훨씬 더 많은 작업입니다. 원하지 않는 AI 유형을 지정하는 것보다

질문특정 요소가 포함된 XML 노드 삭제기본적으로 동일한 질문을 하고 있지만 xml_grep을 사용하면 답변이 없습니다. xml_grep이 합리적으로 인기가 있고 이와 같은 목적으로 구축된 것처럼 보이기 때문에 누군가가 그러한 답변을 제안할 수 있기를 바랍니다. 거의.

답변1

사용 xmlstarlet:

$ xmlstarlet ed -d '//A[not(B)]' file.xml
<?xml version="1.0"?>
<RootEl>
  <A>
    <B/>
  </A>
</RootEl>

XPATH 표현식은 노드를 하위 노드로 포함하지 않는 문서의 //A[not(B)]모든 노드를 선택합니다 . 선택한 노드가 삭제됩니다.AB

표현은 //A[not(child::B)]좀 더 명시적으로 작성될 수도 있습니다.

관련 정보