XML 요소의 이름을 시퀀스로 바꾸기

XML 요소의 이름을 시퀀스로 바꾸기

가능한 XML 기반 솔루션을 찾고 있습니다.또 다른 문제. 나도 알아수락된 답변, 제안 sedpython솔루션.

지정된 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에서 카운터 증가에 대해 찾은 게시물입니다.

내가 사용한 다른 참고 자료는 다음과 같습니다.

관련 정보