gpt4 book ai didi

java - 如何通过 XPath 在 Java 中使用 namespace 查询 XML?

转载 作者:IT老高 更新时间:2023-10-28 13:53:51 25 4
gpt4 key购买 nike

当我的 XML 看起来像这样(没有 xmlns)时,我可以使用 XPath 轻松查询它,例如 /workbook/sheets/sheet[1]

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook>
<sheets>
<sheet name="Sheet1" sheetId="1" r:id="rId1"/>
</sheets>
</workbook>

但是当它看起来像这样时,我就不能

<?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>

有什么想法吗?

最佳答案

在第二个示例 XML 文件中,元素绑定(bind)到命名空间。您的 XPath 正在尝试处理绑定(bind)到默认“无命名空间”命名空间的元素,因此它们不匹配。

首选方法是使用命名空间前缀注册命名空间。它使您的 XPath 更易于开发、阅读和维护。

但是,您不必在 XPath 中注册命名空间并使用命名空间前缀。

可以制定一个 XPath 表达式,该表达式使用一个元素的通用匹配和一个谓词过滤器来限制所需 local-name()命名空间-uri()。例如:

/*[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]

如您所见,它会生成一个非常长且冗长的 XPath 语句,非常难以阅读(和维护)。

您也可以只匹配元素的 local-name() 并忽略命名空间。例如:

/*[local-name()='workbook']/*[local-name()='sheets']/*[local-name()='sheet'][1]

但是,您冒着匹配错误元素的风险。如果您的 XML 包含使用相同 local-name( ),您的 XPath 可能会匹配错误的元素并选择错误的内容:

关于java - 如何通过 XPath 在 Java 中使用 namespace 查询 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com