xmlstarlet 이동은 어떻게 작동하나요?

xmlstarlet 이동은 어떻게 작동하나요?

XML 문서의 요소를 이동하고 싶습니다.xmlstarlet

특히 다음과 같이 변경하고 싶습니다.

<parent>
    <before/>
    <span><a>blah</a></span>
    <after/>  
<parent>
<otherparent>
    <span><a>blah</a></span>
<otherparent>

이 되다..

<parent>
    <before/>
    <a>blah</a>
    <after/>
</parent>
<otherparent>
    <a>blah</a>
</otherparent>

즉, 범위를 제거하고 자식은 유지합니다.

xmlstarlet에는 이동 명령이 있습니다: xmlstart ed -m source target그러나 나는 그것이 어떻게 작동하는지 잘 이해하지 못합니다.

소스 xpath와 대상 xpath가 필요하지만 서로 다른 크기의 컬렉션을 생성할 수 있기 때문에 이들이 어떻게 일치하는지 잘 모르겠습니다. 대상이 소스에 상대적입니까?

답변1

복잡한xmlstarlet해결책:

XML 파일을 입력하세요 test.xml:

<div>
  <parent>
    <before/>
    <span>
      <a>value 1</a>
    </span>
    <after/>
  </parent>
  <otherparent>
    <span>
      <a>value 2</a>
    </span>
  </otherparent>
</div>

일하다:

count=$(xmlstarlet sel -t -v 'count(//span[a])' test.xml)
for ((i=1; i<=$count; i++)); do 
    xmlstarlet ed -L -a '(//span[a])[1]' -t elem -n "a" -v "$(xmlstarlet sel -t -v "(//span/a)[1]" 1.xml)" -d '(//span[a])[1]' test.xml
done

  • countspan- 자식이 있는 a노드의 개수를 포함하는 변수

  • ed- 편집 모드

  • -L- 파일을 제자리에서 수정

  • -a- 추가 조치

  • -d- 삭제 작업


최종 test.xml(처리 후):

<?xml version="1.0"?>
<div>
  <parent>
    <before/>
    <a>value 1</a>
    <after/>
  </parent>
  <otherparent>
    <a>value 2</a>
  </otherparent>
</div>

관련 정보