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解析ラッパーの使用jqyq):

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

その後、XML文書構造内のすべてのノードに移動し、見つかったすべての属性を削除しますxmlnsxmlns: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

関連情報