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
count
span
- 자식이 있는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>