XMLStarlet不会删除元素

时间:2018-03-08 20:27:11

标签: xml bash xpath xml-namespaces xmlstarlet

目前我有以下命令行,其中$ f代表文件:

xmlstarlet ed -d "//*/packageVersions" $f;

我也试过

xmlstarlet ed -d "//packageVersions" $f;

我正在尝试解析包含不同根元素名称的xml文件,这是它的ApexClass下面的示例:

<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>38.0</apiVersion>
    <packageVersions>
        <majorNumber>2</majorNumber>
        <minorNumber>2003</minorNumber>
        <namespace>abc</namespace>
    </packageVersions>
    <packageVersions>
        <majorNumber>2</majorNumber>
        <minorNumber>2001</minorNumber>
        <namespace>def</namespace>
    </packageVersions>
    <status>Active</status>
</ApexClass>

但是在运行脚本之后,我在控制台中看到了文件的内容,但文件没有改变。

对我在这里做错了什么的想法?

1 个答案:

答案 0 :(得分:3)

这是因为默认的命名空间http://soap.sforce.com/2006/04/metadata

尝试将其绑定到前缀并在XPath中使用它。

示例(未经测试)......

xmlstarlet ed -N x="http://soap.sforce.com/2006/04/metadata" -d "//x:packageVersions" $f;

有关详细信息,请参阅http://xmlstar.sourceforge.net/doc/UG/ch05s01.html

如果XML文件可能具有不同的名称空间,但该元素始终为packageVersions(带或不带名称空间前缀),则可以求助于测试本地名称...

xmlstarlet ed -d "//*[local-name()='packageVersions']" $f;