gpt4 book ai didi

xml - 使用XMLStarlet在XML值内替换子字符串

转载 作者:行者123 更新时间:2023-12-03 16:29:20 25 4
gpt4 key购买 nike

我正在尝试编辑/更新一些我无法更改其格式的复杂XML。我在Bash脚本中使用XMLStarlet。

当我尝试检索或编辑某个属性的CDATA值(其中属性"name={name}"不是唯一的并返回多个值)时,我在其中苦苦挣扎。

例如,我有以下XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="key.xsl" ?>
<tables>
<tableset>
<table name="table1">
<row>
<fld name="fileName">
<strval><![CDATA[/my/XYZ/file1]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/XYZ/file2]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/other/XYZ/file3]]></strval>
</fld>
<fld name="worksBecauseUnique">
<strval><![CDATA[/XYZ/unique]]></strval>
</fld>
</row>
</table>
</tableset>
</tables>


使用XMLStarlet时,我可以轻松地编辑以下值:

xmlstarlet ed -L \
-u '//tables/tableset/table/row/fld[@name="worksBecauseUnique"]/strval/text()' \
-v '/ABC/unique' \
myxmlfile.xml


但是,尝试用属性 name=fileName修改任何CDATA值时遇到问题,因为 fileName在XML中出现多次。

我希望输出如下所示:

<fld name="fileName">
<strval><![CDATA[/my/ABC/file1]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/ABC/file2]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/other/ABC/file3]]></strval>
</fld>


问题是,如果我尝试使用XMLStarlet更新 fileName的CDATA值,如何在不更新所有内容的情况下更新它们?

例如,如果我运行:

xmlstarlet ed -L \
-u "//tables/tableset/table/row/fld[@name=\"fileName\"]/strval/text()" \
-v "/my/ABC/file1" \
myxmlfile.xml


我得到以下错误输出:

<fld name="fileName">
<strval><![CDATA[/my/ABC/file1]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/ABC/file1]]></strval>
</fld>
<fld name="fileName">
<strval><![CDATA[/my/ABC/file1]]></strval>
</fld>


注意如何将每个CDATA值设置为 "/my/ABC/file1",在这里我需要 "/my/ABC/file1""/my/ABC/file2""/my/other/ABC/file3"

我希望以某种方式允许某人单独修改每个值...
希望可以使用支持XPath的任何工具来实现。

这里的任何帮助将不胜感激!

最佳答案

提供一个表达式(带有-x),用于将输入修改为所需的输出:

xmlstarlet ed \
-u '//fld/strval[contains(., "/XYZ/")]' \
-x 'concat(substring-before(., "/XYZ/"), "/ABC/", substring-after(., "/XYZ/"))'
<in.xml >out.xml


顺便说一句,在新版本的XPath标准中有更好的字符串替换功能。由于libxml(由XMLStarlet使用)仅支持1.0版,因此该表达式比其他情况稍微有点笨拙。

关于xml - 使用XMLStarlet在XML值内替换子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31835257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com