특정 태그 뒤에 XML 파일에 줄 추가

특정 태그 뒤에 XML 파일에 줄 추가

특정 태그 뒤에 여러 XML 파일에 한 줄을 추가하는 방법은 무엇입니까? 솔루션은 Unix 도구 사용을 기반으로 하거나 이 작업을 빠르고 쉽게 수행할 수 있는 텍스트 편집기 또는 유틸리티의 이름을 지정할 수 있습니다. 편집해야 할 파일이 60개가 넘습니다.

예를 들어 다음과 같은 XML이 있습니다.

  <Node disablePersistence="true">
     <Name>Mapper</Name>
     <Action>
        <Class-Name>com.test.component.Mapper</Class-Name>
        <Param name="output_url" value="constant:file:///output.xml"/>
        <Param name="xml_url" value="constant:file:///input.xml"/>
        <Param name="xsl_url" value="constant:file:///template.xsl"/>
     </Action>
     <Next-Node>ComposeMessage</Next-Node>
  </Node>

먼저 Node 태그를 검색해야 합니다. 그런 다음 Name = Mapper 태그를 검색해야 합니다. 그런 다음 Action 태그를 검색합니다. 그런 다음 Param 태그를 검색하세요. Param에 대한 모든 태그가 있는 곳에 새 줄을 삽입해야 합니다.

        <Param name="new_parameter" value="constant:true"/>

이것이 가능합니까, 아니면 너무 많은 것을 요구하고 모든 파일을 수동으로 편집하는 것이 더 빠릅니까?

답변1

여기 XPath를 사용하는 솔루션이 있습니다 xmlstarlet. 특정 노드를 선택할 수 있음을 보여주기 위해 XML을 확장했습니다.

해결책

xmlstarlet edit \
    --subnode '//Node[Name/text()="Mapper"]/Action' --type elem --name 'Param' \
    --var nap '$prev' \
    --insert '$nap' --type attr --name 'name' --value 'new_parameter' \
    --insert '$nap' --type attr --name 'constant:true'

텍스트 값이 있는 Node/Action요소도 있는 새 하위 노드를 만듭니다 . 이 새 노드를 쉽게 참조할 수 있도록 XPath 변수에 할당합니다 . 마지막으로 여기에 두 가지 속성을 삽입합니다.NameMappernap

예제 XML

<root>
<Node disablePersistence="true">
    <Name>Mapper</Name>
    <Action>
        <Class-Name>com.test.component.Mapper</Class-Name>
        <Param name="output_url" value="constant:file:///output.xml"/>
        <Param name="xml_url" value="constant:file:///input.xml"/>
        <Param name="xsl_url" value="constant:file:///template.xsl"/>
    </Action>
    <Next-Node>ComposeMessage</Next-Node>
</Node>
<Node disablePersistence="true">
    <Name>DoNotTouchMe</Name>
    <Action>
        <Class-Name>com.test.component.Mapper</Class-Name>
        <Param name="output_url" value="constant:file:///output.xml"/>
        <Param name="xml_url" value="constant:file:///input.xml"/>
        <Param name="xsl_url" value="constant:file:///template.xsl"/>
    </Action>
    <Next-Node>ComposeMessage</Next-Node>
</Node>
</root>

결과

<root>
<Node disablePersistence="true">
    <Name>Mapper</Name>
    <Action>
        <Class-Name>com.test.component.Mapper</Class-Name>
        <Param name="output_url" value="constant:file:///output.xml"/>
        <Param name="xml_url" value="constant:file:///input.xml"/>
        <Param name="xsl_url" value="constant:file:///template.xsl"/>
        <Param name="new_parameter" constant:true=""/>
    </Action>
    <Next-Node>ComposeMessage</Next-Node>
</Node>
<Node disablePersistence="true">
    <Name>DoNotTouchMe</Name>
    <Action>
        <Class-Name>com.test.component.Mapper</Class-Name>
        <Param name="output_url" value="constant:file:///output.xml"/>
        <Param name="xml_url" value="constant:file:///input.xml"/>
        <Param name="xsl_url" value="constant:file:///template.xsl"/>
    </Action>
    <Next-Node>ComposeMessage</Next-Node>
</Node>
</root>

관련 정보