【问题标题】:Using xmlstarlet to edit value of property使用 xmlstarlet 编辑属性值
【发布时间】:2021-01-29 08:45:27
【问题描述】:

我有以下 XML 文件:

<Configuration .... status="INFO" >
  <properties>
    <property name="logfile">/var/log/app.log</property>
    <property name="log-level">INFO</property>
  </properties>
</Configuration>

我正在尝试将日志级别属性中的 INFO 替换为 DEBUG。

[root]# xmlstarlet edit --update "/Configuration/properties/property[@name='log-level']/@value" --value DEBUG test.xml
<?xml version="1.0"?>
<Configuration status="INFO">
  <properties>
    <property name="logfile">/var/log/app.log</property2>
    <property name="log-level">INFO</property>
  </properties>
</Configuration>

stdout 中的输出与 orig 文件完全相同,没有任何变化。

我尝试搜索 XPath 以确保我使用了正确的 XPath 并且它有效:

[root]# xmlstarlet sel -t -v "count(Configuration/properties/property[@name='log-level'])" test.xml
1

我也尝试更改@name 而不是@value,并且成功了。

我错过了什么?为什么输出(在标准输出中)没有改变?

【问题讨论】:

  • 使用以下内容:xmlstarlet edit --inplace --update "/Configuration/properties/property[@name='log-level']" --value "DEBUG" test.xml - XPath 中的/@value 部分不是必需的。还要添加--inplace 选项(或它的简写等效-L)来就地编辑文件。如果你想排除 xml 声明,即&lt;?xml version="1.0"?&gt;,在生成的文件中也包括--omit-decl 选项(或它的简写等效-O),例如:xmlstarlet edit --inplace --omit-decl --update "/Configuration/properties/property[@name='log-level']" --value "DEBUG" test.xml
  • @RobC 感谢您的帮助,但我已经找到了解决方案并在此处发布..
  • 当然,这是给其他人的注释,他们可能想就地编辑文件,并省略 xml 声明。

标签: xml xmlstarlet


【解决方案1】:

输入文件:

<Configuration status="INFO" >
  <properties>
    <property name="logfile">/var/log/app.log</property2>
    <property name="log-level">INFO</property>
  </properties>
</Configuration>

要确保您的 XPATH 是正确的,您可以使用以下命令:

[root@]# xmlstarlet el test.xml

    Configuration
    Configuration/properties
    Configuration/properties/property
    Configuration/properties/property

在你选择了正确的 XPath 之后,为了改变属性的值,你需要运行:

[root]# xmlstarlet edit --update "/Configuration/properties/property[@name='log-level']" --value "DEBUG" test.xml
<?xml version="1.0"?>
<Configuration status="INFO">
  <properties>
    <property name="logfile">/var/log/app.log</property2>
    <property name="log-level">DEBUG</property>
  </properties>
</Configuration>

无需像我在问题中那样指定 /@value。如果要更改特定属性的名称,应在 XPath 末尾指定 /@attribute_name,例如:

[root]# xmlstarlet edit --update "/Configuration/properties/property[@name='log-level']/@name" --value "DEBUG" test.xml
<?xml version="1.0"?>
<Configuration status="INFO">
  <properties>
    <property name="logfile">/var/log/app.log</property2>
    <property name="DEBUG">INFO</property>
  </properties>
</Configuration>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多