XMLStarlet 不删除元素

标签 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>

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

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

最佳答案

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

尝试将其绑定(bind)到前缀并在 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;

关于XMLStarlet 不删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49181879/

相关文章:

java - 使用 Rome 库获取 rss 的图像 url

android - 需要通过接受 Android 中的所有证书来通过 https 访问 xml 文件

xml - 在这种情况下如何添加唯一约束?

bash - 检查 S3 文件是否已被修改

php - 带 key 的 REST 响应的 Xpath

xml - 如何在 XPath 中进行否定连接 ("except")?

android - 获取应用页面中的所有按钮

bash - 如何使用 Bash 编写二进制文件?

bash - vscode 上的 Intellisense 终端

xslt - 用 XSL-T 排除第一个 child