首页  >  文章  >  Java  >  如何处理 Java XPath 查询中的 XML 命名空间?

如何处理 Java XPath 查询中的 XML 命名空间?

Patricia Arquette
Patricia Arquette原创
2024-11-11 18:24:03334浏览

How to Handle XML Namespaces in Java XPath Queries?

Java XPath 查询中的 XML 命名空间处理

在 Java 中,当使用 XPath 查询 XML 时,命名空间可能会带来挑战。当 XML 不包含命名空间时,XPath 查询可以很简单,但命名空间的存在会带来复杂性。

情况 1:没有命名空间的 XML

对于没有命名空间的 XML,XPath查询使用默认命名空间,这实际上是没有命名空间的。在这种情况下,像“/workbook/sheets/sheet[1]”这样的查询可以轻松检索元素。

情况 2:带有命名空间的 XML

但是,带有命名空间的 XML像下面这样的命名空间增加了复杂性:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  <sheets>
    <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
  </sheets>
</workbook>

在这种情况下,XPath 表达式“/workbook/sheets/sheet[1]”将会失败,因为元素绑定到“http://schemas.openxmlformats.org/spreadsheetml/2006/main”命名空间。

解决方案:

  1. 命名空间注册:首选方法是注册带有前缀的命名空间,并在 XPath 查询中使用它,使其更易于阅读和维护。
  2. 与谓词的通用匹配: 无需命名空间注册,可以使用更复杂的 XPath 表达式:
/*[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]
  1. 本地名称匹配: 不太受欢迎的选项是仅匹配元素的本地名称,忽略命名空间,但是如果存在混合词汇表,则存在选择不正确元素的风险。

以上是如何处理 Java XPath 查询中的 XML 命名空间?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn