【问题标题】:XMLstarlet delete multiple duplcated tags based on sequenceXMLstarlet 根据顺序删除多个重复的标签
【发布时间】:2022-12-13 20:04:23
【问题描述】:

如果您对以下 XML 有任何帮助,我将不胜感激:

<products>
    <product>
        <Title>Name of product 1</Title>
        <SKU>00016</SKU>
        <Price>1.98</Price>
        <Stock>95</Stock>
        <Price>1.98</Price>
    </product>
        <product>
        <Title>Name of product 2</Title>
        <SKU>00017</SKU>
        <Price>2.15</Price>
        <Stock>45</Stock>
        <Price>2.15</Price>
    </product>
</products>

XML 字段在每个产品中都是重复的,我需要在每个产品中删除这两个字段之一。

我试过这个: xmlstarlet sel -t -c'//Price[1]' -n filename.xml &gt; temp.txt &amp;&amp; xmlstarlet ed -d '//Price[1]' filename.xml &gt; tmp.xml &amp;&amp; mv tmp.xml filename_corrected.xml

但它只要在第一个产品中被删除

【问题讨论】:

    标签: xmlstarlet


    【解决方案1】:

    您可以使用 YAML 处理器 mikefarah/yq 而不是 xmlstarlet 来解决您的任务:

    yq --input-format xml --output-format xml '.products.product |= map(.Price |= .[0])' "$FILE"
    

    输出

    <products>
      <product>
        <Title>Name of product 1</Title>
        <SKU>00016</SKU>
        <Price>1.98</Price>
        <Stock>95</Stock>
      </product>
      <product>
        <Title>Name of product 2</Title>
        <SKU>00017</SKU>
        <Price>2.15</Price>
        <Stock>45</Stock>
      </product>
    </products>
    

    【讨论】:

    • 谢谢您的回答。我已经尝试过了,在另一个问题上找到了非常相似的答案,但没有设法将 yq 安装到我的系统中。在本地系统上,它运行良好且正确。但是再次感谢你。
    • 我最终将 yq 安装到服务器并且运行良好。再次感谢。也欢迎使用 xmlstarlet 的任何答案以获得语法帮助
    【解决方案2】:

    使用 xmlstartlet,这很简单

    xml ed -d  '//Price[1]'   yourfile.xml
    

    输出应该是你正在寻找的。

    【讨论】:

    • @weby 很高兴听到!如果我们完成了,请不要忘记接受答案。
    猜你喜欢
    • 2018-07-09
    • 2020-07-15
    • 2015-09-24
    • 1970-01-01
    • 2022-08-15
    • 2019-06-23
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多