我有以下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中找到现有的问题和答案,但是找不到相关的问题。 任何帮助都非常感谢。
答案 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”,然后在没有值时插入新值,否则它不应该做任何事情