xml - 如何使用 xml-patch 和 xpath 修补带有命名空间的 xml 文件?

标签 xml xpath namespaces

我正在尝试使用 修补几个 XML 文件XML 补丁 ,更具体地说是使用这个库 https://github.com/dnault/xml-patch
我可以正确修补任何不包含任何 的 xml 文件命名空间 声明。我正在修补 logback.xml 文件并且一切正常。
问题是当我尝试修补如下所示的 web.xml 文件时:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true">

    <display-name>My App</display-name>
...
</web-app>
使用如下所示的 xml-patch 文件
<diff file="WEB-INF/web.xml">
    <add sel="web-app" >
        <simple>true</simple>
    </add>
</diff>
当我运行修补程序时,出现此异常:
Caused by: com.github.dnault.xmlpatch.PatchException: no matches for selector "web-app"
    at com.github.dnault.xmlpatch.Patcher.selectNodes(Patcher.java:441)
    at com.github.dnault.xmlpatch.Patcher.add(Patcher.java:252)
    at com.github.dnault.xmlpatch.Patcher.patch(Patcher.java:85)
    at com.github.dnault.xmlpatch.Patcher.patch(Patcher.java:65)
    at com.github.dnault.xmlpatch.CommandLineDriver.main(CommandLineDriver.java:62)
我相当有信心这一定是 diff 文件和命名空间的问题,我可能没有正确配置。
我曾尝试向 diff 文件添加命名空间声明,但错误是相同的。
有任何想法吗?

最佳答案

看起来这是一个确认issue的工具。但是,原始海报还提到了一种解决方法:

So in effect I haver to declare the defaultnamespace twice in order to allow selection and addition of new nodes without having to prefix the added nodes one by one with "cfg:" prefix. See the following example:


应用于您的示例,patch.xml 应如下所示。
<diff xmlns:app="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" metadata-complete="true">
    <add sel="app:web-app">
        <simple>true</simple>
    </add>
</diff>
这样补丁就成功了。

关于xml - 如何使用 xml-patch 和 xpath 修补带有命名空间的 xml 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62773493/

相关文章:

xml - XPath搜索的麻烦

javascript - 是否存在 XML 对象遵循的高度或宽度的 DOM 或 CSS 属性

javascript - 是否可以使用 xPath 从脚本中提取数据?

python - 从 lxml xpath 查询操作列表

xml - 是否可以使用XSLT对这些数据求和?

PHP 命名空间和 spl_autoload_register

c++ - 导出两个命名空间中的重复函数 (C++)

XML 解析错误 : XML declaration not well-formed

xml - 覆盖每个 xslt

c++ - 使用 C++11 选项编译 C++98 代码时,由于 Boost header 导致的不明确重载