XML 파일의 지정된 태그 내에 태그 문자 체인을 포함 해제하는 방법

XML 파일의 지정된 태그 내에 태그 문자 체인을 포함 해제하는 방법

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>

관련 정보