【问题标题】:Replacing a tag value in XML using xmlstarlet使用 xmlstarlet 替换 XML 中的标记值
【发布时间】:2019-01-09 19:59:25
【问题描述】:

我正在尝试用 input.xml 中的 lookup 替换值 test。该脚本正在执行而没有任何错误,但它没有替换该值。

sed -i '/<Filter>/,/<\/Filter>/s/test/lookup/' input.xml > input_1.xml

下面是我的 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>

【问题讨论】:

  • 请点击edit并将示例输入添加到问题中。添加示例后,选择它们并使用{}按钮或ctrl+k格式化数据以便更好地查看...另外,使用 xmlstarlet 之类的解析器而不是 sed 来编辑 xml 数据
  • 你能帮我用 xmlstarlet 示例来编辑 xml。我是 shell 脚本新手

标签: xml shell sed xmlstarlet


【解决方案1】:

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

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

xmlstarlet edit --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml

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

xmlstarlet edit -L --update '//NikuDataBus/LookupQuery/Filter' --value 'lookup' input.xml 

或者,如果Filter 标签包含test,您可以更进一步,进行替换,您可以这样做

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

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

$ xmlstarlet --version
compiled against libxml2 2.9.1, linked with 20901
compiled against libxslt 1.1.28, linked with 10128

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

$ xmlstarlet el input.xml
NikuDataBus
NikuDataBus/Header
NikuDataBus/LookupQuery
NikuDataBus/LookupQuery/Filter

【讨论】:

  • 如果我只想使用 shell 脚本编辑 xml 怎么办。我没有使用 xmlstarlet 的权限。我的要求是根据用户输入更新 标记值。
  • @priyanka:这是解决问题的理想方法。如果不能使用xmlstarlet,祝你好运使用其他工具解决问题
【解决方案2】:

我完全同意 Inian 所说的一切,但您还应该注意您的正则表达式不正确:您的示例数据不包含字符串 &lt;Filter&gt;。因此,您需要使用不同的模式,例如:

 sed '/<Filter/,/<\/Filter>/s/test/lookup/' ...

但是,同样,你不应该。

【讨论】:

  • 你的意思是在语法中我必须添加整个 '' 东西?
  • 成功了。谢谢 。我可以知道为什么我不应该使用它吗?
  • 因为太脆了。 sed 的基本构建块是一条线,XML 的基本构建块是一个节点。您想更改节点内的数据。在您的示例中,该节点恰好被整齐地隔离在一行上,但总的来说,这不能被视为理所当然。
猜你喜欢
  • 2018-03-05
  • 2015-10-28
  • 2011-01-07
  • 2023-03-28
  • 1970-01-01
  • 2013-11-19
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多