xml - 使用 xmlstarlet 编辑属性值

标签 xml xmlstarlet

我有以下 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 中的输出与原始文件完全相同,没有任何更改。

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

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

我还尝试更改@name而不是@value,它起作用了。

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

最佳答案

输入文件:

<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>

关于xml - 使用 xmlstarlet 编辑属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65899565/

相关文章:

xmlstarlet:如何有条件地添加缺失的元素(upsert)

xml - 使用 xmlstarlet 1.6.1 更新带有命名空间的 XML

xpath - 使用XMLStarlet删除属性

xml - 如何在 xpath 中定义默认的 salesforce 命名空间

android - 如何修复线性布局中的layout_weight?

javascript - 使用 Javascript 将 xml POST 到 api

使用 javax.xml.bind.annotations 将 Java 对象转换为 XML

regex - 从日志文件中提取特定的 XML

xml - 在 XMLStarlet 中处理长编辑列表

java - 无法实例化 Activity ComponentInfo{ProductSimpleInfoActivity} NullPointerException