使用带有 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'
。
我有一个像这样的 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'
。