使用带有 xmlstarlet 的 XPath 表达式更新 XML

Update XML using XPath expression with xmlstarlet

我有一个像这样的 junit 报告 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<testsuites>
    <testsuite>
        <testcase classname='Formatting Test' name='Test.swift'>
            <failure message='Function parameters should be aligned vertically'>warning: Line:39 </failure>
        </testcase>
        <testcase classname='Formatting Test' name='Test.swift'>
            <failure message='Function parameters should be aligned vertically'>warning: Line:40 </failure>
        </testcase>
    </testsuite>
</testsuites>

我想使用 XMLStarlet 将 <failure> 标签的内容替换为其 message 属性。我发现了一个关于使用 xpath 表达式更新的类似问题:SO question

但是如果我尝试这些命令中的任何一个:

xmlstarlet edit -u '//testsuites/testsuite/testcase/failure' -x '@message/text()' test.xml
xmlstarlet edit -u '//testsuites/testsuite/testcase/failure' -x '@message' test.xml

然后 <failure> 值完全消失了。如果我使用这个(只是为了测试):

xmlstarlet edit -u '//testsuites/testsuite/testcase/failure' -x '../@name' test.xml

结果将是:

<?xml version="1.0" encoding="utf-8"?>
<testsuites>
  <testsuite>
    <testcase classname="Formatting Test" name="Test.swift">
      <failure message="Function parameters should be aligned vertically" name="Test.swift"/>
    </testcase>
    <testcase classname="Formatting Test" name="Test.swift">
      <failure message="Function parameters should be aligned vertically" name="Test.swift"/>
    </testcase>
  </testsuite>
</testsuites>

它将 name 属性附加到 <failure> 标签! xpath 对 -x 参数的工作方式令人困惑。那么如何将<failure>标签的内容替换成它的属性值呢?

我认为你很接近,但你正在选择一个属性节点。这就是在您的最后一个命令行示例中添加 name 属性的原因。

要使用属性的值,请将其转换为带有 string() 的字符串。

试试这个更新后的命令行:

xmlstarlet edit -u '//testsuites/testsuite/testcase/failure' -x 'string(@message)' test.xml

注意:您也可以将 -u 缩短为 '//failure'