【问题标题】:How to comment out a parent xml tag with a specific child tag using sed?如何使用 sed 注释掉带有特定子标签的父 xml 标签?
【发布时间】:2020-01-03 02:57:16
【问题描述】:

我有一个如下所示的 xml 文件。如果<name>xyz,整个父<types> 应该被注释掉。我如何使用 sed 来实现这一点?

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="test">
    <types>
        <name>abc</name>
        <members>abc_member_1</members>
        <members>abc_member_2</members>
    </types>
    <types>
        <name>def</name>
        <members>def_member_1</members>
        <members>def_member_2</members>
        <members>def_member_3</members>
    </types>
    <types>
        <name>xyz</name>
        <members>xyz_member_1</members>
    </types>
    <version>1.0</version>
    <fullName>test</fullName>
<Package>

我尝试过使用它,它只适用于单行。

sed -i -e '/xyz/s/\(^.*$\)/<!--\1-->/' ./sample.xml
    rm -rf ./sample.xml-e

【问题讨论】:

  • 你有没有看过 XSLT 的这种东西?可能会容易一些。

标签: xml bash sed


【解决方案1】:

如果您可以忍受命名空间 URI 不是绝对的警告,您可以使用以下 XSLT-1.0 样式表(在修复您的 &lt;/Package&gt; 结束标记之后)。

它只是将身份模板与模板结合使用(并非所有 XSLT 处理器都支持)disable-output-escaping="yes" 选项来注释掉相关的&lt;types&gt; 元素。形式上正确的方法是使用 &lt;xsl:comment&gt; 元素,但不幸的是它不支持元素树作为子元素(仅文本节点)。所以 hackdisable-output-escaping 在这种情况下是唯一的选择

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tst="test">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

    <!-- Identity template --> 
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template> 

    <xsl:template match="tst:types[tst:name='xyz']">
        <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
            <xsl:copy-of select="." />
        <xsl:text disable-output-escaping="yes">--></xsl:text>
    </xsl:template>


</xsl:stylesheet>

最后说明:
总是使用像 xsltproc 这样的 XSLT 处理器来处理 XML 文件比使用 sedawk 更好。

【讨论】:

    【解决方案2】:

    如果你不能使用更好的工具,这个gnu awk 可以:

    awk '{a[NR]=$0} /name.xyz/ {s=NR-1} s && /<\/types>/ {e=NR} END {for(i=1;i<=NR;i++) print i>=s&&i<=e?"#"a[i]:a[i]}' file
    <?xml version="1.0" encoding="UTF-8"?>
    <Package xmlns="test">
        <types>
            <name>abc</name>
            <members>abc_member_1</members>
            <members>abc_member_2</members>
        </types>
        <types>
            <name>def</name>
            <members>def_member_1</members>
            <members>def_member_2</members>
            <members>def_member_3</members>
        </types>
    #    <types>
    #        <name>xyz</name>
    #        <members>xyz_member_1</members>
    #    </types>
        <version>1.0</version>
        <fullName>test</fullName>
    <Package>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2014-11-16
      • 2018-11-01
      • 1970-01-01
      • 2021-09-12
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多