需要shell脚本编写的帮助来查找和替换xml文件中的值

时间:2017-09-26 14:59:43

标签: xml linux shell sed scripting

我有以下XML格式

<object class="Class A">
<directory>someString1</directory>
<attr>
     <name>length</name>
     <value>6</value>
 </attr>
 <attr>
     <name>parent</name>
     <value>1</value>
 </attr>
 <attr>
     <name>Status</name>
     <value>1</value>
 </attr>
 <attr>
     <name>className</name>
     <value>Class A</value>
 </attr>
 <attr>
     <name>Instance</name>
     <value>InstanceValue</value>
 </attr>
 </object>
 ...
 <object class="Class D">
 <directory>someString4</directory>
 <attr>
     <name>length</name>
     <value>8</value>
 </attr>
 <attr>
     <name>parent</name>
     <value>1</value>
 </attr>
 <attr>
     <name>Status</name>
     <value>1</value>
 </attr>
 <attr>
     <name>className</name>
     <value>Class D</value>
 </attr>
 <attr>
     <name>Instance</name>
     <value></value>
 </attr>
 </object>
 ....

我只需找到特定的D类对象,并查找该对象的Instance值是否为空,如果为空,则填充一些作为参数提供的值。请注意,XML文件中可能有多个对象,XML标记的名称和值有很多重复。此外,我需要在suse Linux上使用shell脚本来完成它。

我是shell脚本和SED的新手。我尽我所能在stackoverflow中找到现有的问题和答案,但是找不到相关的问题。 任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:2)

如果您可以使用xmlstarlet,则可以执行以下操作:

xml ed -L -u "//object[@class='Class D']/attr[name='Instance'][value='']/value" -v "new value" input.xml

注意:-L就地编辑了文件。如果不需要,请将其删除。

或者,您可以使用xsltproc使用XSLT处理XML:

xsltproc -o output.xml stylesheet.xsl input.xml

stylesheet.xsl的位置:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="object[@class='Class D']/attr[name='Instance' and value='']/value">
    <xsl:copy>
      <xsl:text>new value</xsl:text>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

您能否根据需要检查它是否有效?

#!/bin/bash

VALUE="NewValue"
sed -i data.xml -re "
/Class D/,/<\/object>/ {
    /<name.*>Instance<\/name>/,/<\/value>/ {
        s/(<value.*>)(<\/value>)/\1${VALUE}\2/
    }
}
"

它应该找到你的类,然后找到名称“Instance”,然后在没有值时插入新值,否则它不应该做任何事情