使用 xmlstarlet 替换 XML 中的标记值

pri*_*nka 2 xml shell sed xmlstarlet

我试图testlookupinput.xml替换该值。脚本正在执行,没有任何错误,但它没有替换该值。

sed -i '/<Filter>/,/<\/Filter>/s/test/lookup/' input.xml > input_1.xml
Run Code Online (Sandbox Code Playgroud)

下面是我的 input.xml 文件:

<NikuDataBus
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./src/webroot/WEB-INF/xog/xsd/nikuxog_entity.xsd">
    <Header version="14.2" action="read" objectType="contentPack" externalSource="NIKU"/>
    <LookupQuery>
        <Filter name="code" criteria="EQUALS">test</Filter>
    </LookupQuery>
</NikuDataBus>
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 6

XML使用非语法感知工具解析sed是一个坏主意。如果XML格式稍有变化,解决方案就会中断。使用xmlstarlet哪个是用于编辑文件的语法感知工具。

由于您的文件在语法上也有效,因此解决您的问题非常简单。做就是了

xmlstarlet edit --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml
Run Code Online (Sandbox Code Playgroud)

要像 一样就地编辑文件sed -i,请使用-L解决方案的标志(如果您的版本支持它)或使用临时文件 ( > temp && mv temp input.xml)

xmlstarlet edit -L --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml 
Run Code Online (Sandbox Code Playgroud)

或者,您可以更进一步,Filter标签包含test您可以执行的操作时才进行替换

xmlstarlet edit --update '//NikuDataBus/LookupQuery/Filter[contains(.,"test")]' --value 'lookup' input.xml
Run Code Online (Sandbox Code Playgroud)

在以下版本的 Centos 7 上测试。

$ xmlstarlet --version
compiled against libxml2 2.9.1, linked with 20901
compiled against libxslt 1.1.28, linked with 10128
Run Code Online (Sandbox Code Playgroud)

感谢来自Perl专家Sundeep的有用评论之一,您可以看到可以遍历的路径列表,您可以在这些路径上应用操作xmlstarlet

$ xmlstarlet el input.xml
NikuDataBus
NikuDataBus/Header
NikuDataBus/LookupQuery
NikuDataBus/LookupQuery/Filter
Run Code Online (Sandbox Code Playgroud)