1

我有数百个 xml 文件,我想在特定位置对其进行一次性编辑。在每个 xml 文件中的某个地方,我都有一些看起来像这样的东西。

   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"/>

属性的数量和它们的名称会根据文件而变化,但SomeTag不会。我想在最后一个属性之后添加另一个属性。

我意识到以这种方式编辑 xml 很愚蠢,但这只是我想做的一项临时工作sed,但我无法弄清楚多行的用法。

4

3 回答 3

3

我会使用转换样式表和标识模板 (XSLT)。

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="SomeTag">
  <xsl:copy>
    <xsl:attribute name="newAttribute">
      <xsl:value-of select="'whatever'"/>
    </xsl:attribute>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这将复制整个 XML,但将运行为您的“SomeTag”定义的模板。

取自这里

于 2013-03-05T09:23:25.547 回答
2

您可以使用 XML 外壳xsh

for my $file in { glob "*.xml" } {
    open $file ;
    for //SomeTag set @another 'new value' ;
    save :b ;
}
于 2013-03-05T09:49:52.650 回答
1

如果您的输入文件真的那么简单且格式一致:

$ cat file
foo
   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"/>
bar

$ gawk -v RS='\0' -v ORS= '{sub(/<SomeTag[^/]+/,"&\n     attribute4 = \"eureka\"")}1' file
foo
   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"
     attribute4 = "eureka"/>
bar
于 2013-03-05T15:55:55.777 回答