有条件地删除XML文件的一部分

时间:2012-05-26 21:42:53

标签: xml awk

我正在寻找这个问题的解决方案,并怀疑awk应该提供一个简单的解决方案而不是我笨拙的shell脚本。

我有一个由多个部分组成的xml文件,如下所示。我还有一个值列表。

对于我的列表中value_x所在的每个部分<top_tag> ... </top_tag>,删除(即:不打印)部分<top_tag> ... </top_tag>

<xml>
<outer_tag>
   <top_tag>
      <tag>value_1</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_2</tag>
      <other_tags></other_tags>
   </top_tag>
    ...
   <top_tag>
      <tag>value_n</tag>
      <other_tags></other_tags>
   </top_tag>
</outer_tag>

非常感谢您的建议。

2 个答案:

答案 0 :(得分:2)

这里你需要的不是awk而是XSLT,它是专门为这类任务创建的。它允许您将xml文档转换为不同的xml。

对于像你这样的输入:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<outer_tag>
   <top_tag>
      <tag>value_1</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_2</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_3</tag>
      <other_tags></other_tags>
   </top_tag>
   <top_tag>
      <tag>value_n</tag>
      <other_tags></other_tags>
   </top_tag>
</outer_tag>

以下XSLT删除了top_tagvalue_3元素,只是不复制它们并忽略它们的内容。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*">
        <xsl:element name="{name()}">           
            <xsl:apply-templates select="child::node()"></xsl:apply-templates>
        </xsl:element>
    </xsl:template>

    <xsl:template match="top_tag[tag = 'value_3']">     
    </xsl:template>
</xsl:stylesheet

每种主要的编程语言都至少有几个可以根据XSLT处理XML输入的库。命令行工具和基于UI的应用程序(IDE,但不仅仅是那些)也可以这样做。最后,如果您使用如下处理指令包含xsl文件,Web浏览器可以使用XSLT转换文件:

<?xml-stylesheet type="text/xsl" href="example.xsl"?>

答案 1 :(得分:2)

这可能对您有用:

 sed -i '/<top_tag>/,/<\/top_tag>/!b;/<top_tag>/{h;d};H;/<\/top_tag/!d;x;/<tag>value.*<\/tag>/d' file