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를 포함하는 것으로 원한다고 말하지 않는지 누군가가 묻을 것이라고 확신합니다. 문제는 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)]이 표현은 좀 더 명시적 으로 작성할 수도 있습니다 .

관련 정보