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