”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 XPath 在 Java 中通过命名空间查询 XML?

如何使用 XPath 在 Java 中通过命名空间查询 XML?

发布于2024-11-10
浏览:529

How to Query XML with Namespaces in Java Using XPath?

使用 XPath 在 Java 中通过命名空间查询 XML

当处理包含绑定到命名空间的元素的 XML 文档时,使用 XPath 查询可能会变得具有挑战性。考虑以下示例:

使用默认的“无命名空间”XPath 表达式(如“/workbook/sheets/sheet[1]”)将会失败。这是因为 XML 文档中的元素绑定到命名空间,而 XPath 表达式中不考虑该命名空间。

解决方案 1:注册命名空间并使用命名空间前缀

推荐的方法是使用名称空间前缀注册名称空间,使 XPath 更易于阅读和维护:

NamespaceContext namespaceContext = new NamespaceContext() {
    @Override
    public String getNamespaceURI(String prefix) {
        if (prefix.equals("main")) {
            return "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
        } else if (prefix.equals("r")) {
            return "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
        }
        return null;
    }
};
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
xPath.setNamespaceContext(namespaceContext);

NodeList nodes = (NodeList) xPath.evaluate("/main:workbook/main:sheets/main:sheet[1]", document, XPathConstants.NODESET);

使用命名空间前缀,XPath 表达式变为“/main:workbook/main:sheets/main:sheet[1]”,它正确地寻址绑定到指定命名空间的元素。

解决方案 2:通用匹配和谓词过滤器

或者,可以通过使用元素的通用匹配和指定所需 local-name() 和 namespace-uri() 的谓词过滤器来构造不带命名空间前缀的 XPath 表达式:

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();

NodeList nodes = (NodeList) xPath.evaluate("/*[local-name()='workbook' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']"  
        "/*[local-name()='sheets' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']"  
        "/*[local-name()='sheet' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main'][1]",
        document, XPathConstants.NODESET);

此方法很冗长,如果 XML 文档中存在混合词汇,则可能会带来风险。

结论

当处理带有命名空间的 XML 文档时,必须考虑命名空间绑定。通过使用前缀注册命名空间或精心设计通用 XPath 表达式,可以执行准确可靠的查询。

最新教程 更多>
  • 如何仅检索 LEFT JOIN 中的第一行?
    如何仅检索 LEFT JOIN 中的第一行?
    仅检索 LEFT JOIN 中的第一行在 SQL 中,执行 LEFT JOIN 操作可能会导致右表中出现多行与左表中的一行相匹配。在某些情况下,希望为左表中的每一行仅检索右表中的第一行。考虑以下简化的数据结构:**Feeds** id | title | content --------------...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18
  • 如何修复 C++ 中指针和整数之间的比较错误
    如何修复 C++ 中指针和整数之间的比较错误
    C 中的比较错误:指针与整数尝试从 Bjarne Stroustrup 的 C 书籍第三版开发人员中编译一个简单函数时可能会遇到编译时错误:error: ISO C forbids comparison between pointer and integer将指针与整数进行比较时会出现此问题。在...
    编程 发布于2024-11-18
  • 为什么我的 Keras 模型仅在数据集的一部分上进行训练?
    为什么我的 Keras 模型仅在数据集的一部分上进行训练?
    Keras 训练数据差异在按照官方 TensorFlow 指南使用 Keras 构建神经网络时,您注意到该模型仅使用尽管有 60,000 个条目,但训练期间可用数据集的一部分。了解批量大小模型拟合期间显示的数字 1875 并不表示训练样本,而是表示批次数量。 model.fit 方法有一个可选参数,...
    编程 发布于2024-11-18
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-18
  • 为什么推迟 GZIP Writer 关闭会导致 Go 中的数据丢失?
    为什么推迟 GZIP Writer 关闭会导致 Go 中的数据丢失?
    延迟 GZIP Writer 关闭会导致数据丢失在 Go 中,使用 defer 关闭 gzip.Writer 可能会导致意外的 EOF 错误从压缩数据中读取。要解决此问题,让我们深入研究问题的具体情况并提供替代解决方案。理解问题:gzip.Writer 的 Close 方法执行两项任务:它将所有未写...
    编程 发布于2024-11-18
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-18
  • 接口如何实现超越简单方法定义的多态性?
    接口如何实现超越简单方法定义的多态性?
    多态性:不仅仅是方法定义在面向对象编程中,接口在确保代码灵活性和可重用性方面发挥着至关重要的作用。虽然您正确地声明接口只需要实现它们的类来提供必要的方法,但它们的真正价值远远超出了方法声明。考虑您提供的示例,使用 IBox 接口和 Rectangle 类。直接创建 IBox 实例是不可能的,因为接口...
    编程 发布于2024-11-18
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-18
  • 为什么 Java 中的数组不能保存通用项?
    为什么 Java 中的数组不能保存通用项?
    数组可以保存泛型项吗?泛型类型和数组在 Java 中的交互方式不同。考虑以下代码:ArrayList<Key> a = new ArrayList<Key>();此代码编译成功,创建一个名为 a 的通用 ArrayList。但是,下面的代码无法编译通过:ArrayList&l...
    编程 发布于2024-11-18
  • 为什么键入“String”后 Eclipse 的 Java 代码补全不起作用?
    为什么键入“String”后 Eclipse 的 Java 代码补全不起作用?
    Eclipse/Java 代码完成故障:故障排除Eclipse 是一种流行的 Java 开发环境,偶尔会遇到代码完成功能的问题。当用户在输入“String”后按“Ctrl”“Space”时遇到代码完成无法生成建议的情况时,就会出现这样的问题。该问题表现为“无默认提案”消息,并伴有指示未完成的状态栏。...
    编程 发布于2024-11-18
  • 将 fetchall() 与 MySQLDB SSCursor 结合使用对于大型数据集实际上有效吗?
    将 fetchall() 与 MySQLDB SSCursor 结合使用对于大型数据集实际上有效吗?
    高效利用 MySQLDB SSCursor 处理大型结果集处理涉及数十万或更多行的庞大结果集时,高效的内存管理变得尤为重要至关重要的。因此,MySQLDB SScursor(流式选择游标)成为最小化内存消耗的合适工具。带基础游标的 Fetchall() 与 SSCursor 的区别与普遍看法相反,从...
    编程 发布于2024-11-18
  • 我如何在前端使用 Service Worker 优化加载时间
    我如何在前端使用 Service Worker 优化加载时间
    您是否遇到过网站加载时间过长的情况,如下图所示? ?你听说过服务人员吗? 在这篇文章中,我们将深入探讨什么是 Service Worker?、它们如何工作 ⚙️,以及我如何使用它们来提高 Web 应用程序的性能。 什么是 Service Worker? ? Service Worker 是一个独...
    编程 发布于2024-11-18
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 如何使用纯 CSS 创建等高列?
    如何使用纯 CSS 创建等高列?
    使用 CSS 实现等高列在 Web 开发领域,对视觉吸引力布局的追求往往导致对等高布局的渴望高度列。使用纯 CSS 实现这种效果可能是一个挑战,促使许多开发人员转向背景图像等解决方案。然而,存在一种更简单、更有效的方法。垂直表格方法为了在不借助背景图像的情况下实现等高列,“垂直表格”方法事实证明它既...
    编程 发布于2024-11-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3