다른 요소가 포함된 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)]
선택합니다 . 선택한 노드가 삭제됩니다.A
B
//A[not(child::B)]
이 표현은 좀 더 명시적 으로 작성할 수도 있습니다 .