가능한 XML 기반 솔루션을 찾고 있습니다.또 다른 문제. 나도 알아수락된 답변, 제안 sed
및 python
솔루션.
지정된 XML 조각은 다음과 같습니다.
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
요소 이름을 시퀀스 , 등 <Name/>
으로 변경해야 합니다 .<Name1/>
<Name2/>
<Name3/>
다음과 같이 요소 값의 이름을 고정 값으로 바꿀 xmlstarlet
수 있습니다.<Name/>
xmlstarlet ed -u '//Name' -v 'Another' names.xml
<Names>
<Another>Luigi</Another>
<Another>Mario</Another>
<Another>Peach</Another>
</Names>
-x
( )를 사용하여 요소 값을 표현식으로 변경할 수도 있습니다 --expr
.
-x
하지만 요소 이름 자체를 편집하는 경우 ( --expr
) 옵션을 대체하는 -v
( ) 옵션 이 없으므로 --value
다음과 같은 옵션을 사용할 수 없습니다.
xmlstarlet ed -u '//Name' -x 'concat(., position())' names.xml
와 같은 XML 인식 도구를 사용하면 xmlstarlet
입력 XML을 변환하여 <Name/>
해당 요소를 구별할 수 있습니까? 그렇다면 어떻게 해야 합니까?
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
답변1
XML 명령줄 도구에 대한 나의 경험으로는 부족한 점이 많습니다. 거의 예외없이 나는 포기하고 Python을 사용하고 있습니다. 즉, basex
이 문제를 해결하기 위해 이 유틸리티를 사용할 수 있는 XQuery 솔루션이 있다고 생각합니다. 다음은 XQuery 표현식입니다.
<!-- xml_rename_sequence.xquery -->
for $name at $position in doc('names.xml')//Name
return rename node $name as concat(name($name),$position)
이것은 XML 데이터 파일입니다.
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
스크립트를 실행하는 방법은 다음과 같습니다(파일을 제자리에서 수정함).
basex -u xml_rename_sequence.xquery
업데이트된 데이터 파일은 다음과 같습니다.
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
또한 다음 도구를 사용해 보았으나 성공하지 못했습니다.
다음은 XQuery에서 카운터 증가에 대해 찾은 게시물입니다.
내가 사용한 다른 참고 자료는 다음과 같습니다.