XML 파일에서 지정된 태그 내에 태그 문자 체인을 포함 해제하는 xmlstarlet 명령은 무엇입니까?
예: 태그가 나타나는 모든 항목을 검색 <b>
하고 해당 태그가 태그 내에 있는 경우에만 제거하면 됩니다 <c> ... </c>
.
- 입력 예:
<c>This is <b>an example</b>. <a>This is <b>a test;</b></a></c>
- 원하는 출력:
<c>This is an example. <a>This is <b>a test;</b></a></c>
요약을 위해 예제의 두 번째 문장을 유지합니다.
<a>This is <b>a test;</b></a>
하지만 이것이 문제가 된다면 무시해도 됩니다.
답변1
--update
노드의 값을 //c/b
상위 노드에 복사한 다음 --delete
현재 필요하지 않은 노드를 삭제 하면 됩니다 b
.
이것은 내가 마지막에 취한 접근 방식과 유사합니다.귀하의 질문에 대한 이전 답변 중 하나xmlstarlet
, 먼저 처리해야 하는 모든 노드의 컬렉션을 보유하는 내부 변수를 만든 다음 해당 노드를 처리합니다. 업데이트 및 삭제 작업을 위해 동일한 노드 집합에 더 쉽게 액세스할 수 있도록 하기 위해 이렇게 합니다. 이전 답변에서 이것은필요한, 하지만 여기에는 가독성을 위한 것입니다.
xmlstarlet ed \
--var 'path' '//c/b' \
--update '$path/../text()[1]' --expr 'concat(., $path/text())' \
--delete '$path' file.xml
여기서 업데이트는 b
노드의 상위 노드에 대한 것이 아니라 상위 노드에 대한 것이라는 점에 주목할 가치가 있습니다.첫 번째 텍스트 값, text()[1]
.샘플 문서에서 노드 상위 노드의 첫 번째 텍스트 값은 //c/b
문자열입니다 This is
. 이것두번째텍스트 값은 노드 .
뒤에 옵니다 b
. 아무것도 선택 하지 않으면 [1]
결국
<?xml version="1.0"?>
<c>This is an example. an example<a>This is <b>a test;</b></a></c>
즉, 문자열은 노드의 두 텍스트 값 뒤에 an example
삽입됩니다 .c
이제 우리는 얻습니다.
<?xml version="1.0"?>
<c>This is an example. <a>This is <b>a test;</b></a></c>