xmlstarlet을 사용하여 xml에서 모든 네임스페이스 속성을 제거합니다.

xmlstarlet을 사용하여 xml에서 모든 네임스페이스 속성을 제거합니다.

다음 XML에서 모든 네임스페이스 속성을 제거하고 싶습니다.

<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>

다음 명령을 사용하여 제거를 시도했지만 xmlns어쨌든 입력이 변경되지 않습니다.

xmlstarlet ed \
-N n="urn:oasis:names:tc:SAML:2.0:metadata" \
-d '/md:EntityDescriptor/@*[n:name()="xmlns"]' \
<<< '<md:EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:md="_"></md:EntityDescriptor>' \
> ttt.xml

예상 출력:

<md:EntityDescriptor></md:EntityDescriptor>

답변1

이를 수행하기 위한 몇 가지 XSLT 솔루션을 찾았는데, 둘 다 다음을 사용하여 쉽게 처리됩니다 xmlstarlet.

  1. XSLT를 사용하여 XML 파일에서 네임스페이스와 해당 접두사를 제거하는 방법은 무엇입니까?- IBM
  2. XSLT: 요소에서 네임스페이스 접두사 제거- 스택 오버플로

아래 작업 예제에서는 IBM 코드를 사용하여 파일에 저장했습니다 xslt_ibm.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- https://www.ibm.com/support/pages/how-remove-namespace-and-its-prefixes-xml-file-using-xslt -->
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/|comment()|processing-instruction()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

XML 파일을 파일에 저장하려는 경우 file.xml이 명령은 네임스페이스 외부의 모든 요소와 속성의 이름을 바꿉니다.

xmlstarlet transform xslt_ibm file.xml

입력 ( file.xml)

<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>

산출

<?xml version="1.0"?>
<EntityDescriptor/>

답변2

Andrey Kislyuk의 xqXML 구문 분석 래퍼 사용 jq(yq):

xq -x 'walk(del( .["@xmlns"]?, .["@xmlns:md"]? ))' file

그러면 XML 문서 구조의 모든 노드를 탐색하고 발견된 모든 속성을 제거합니다 xmlns.xmlns:md

일부 입력 문서가 주어지면

<?xml version="1.0"?>
<root test="val">
  <md:EntityDescriptor xmlns="urn:_" xmlns:md="_"/>
</root>

... 출력됩니다

<root test="val">
  <md:EntityDescriptor></md:EntityDescriptor>
</root>

--in-place내부 편집을 위해 또는 옵션을 사용할 수 있습니다 -i.

관련 정보