name() 和 local-name() 有什么区别

作者:编程家 分类: xml 时间:2025-07-18

name()和local-name()都是XPath函数,用于获取XML文档中的元素名称。

name()函数返回当前节点的完整名称,包括命名空间前缀(如果有的话)和节点名称。例如,如果有一个节点,name()函数将返回"ns:book"。

local-name()函数返回当前节点的本地名称,即节点名称去除命名空间前缀。例如,对于节点,local-name()函数将返回"book"。

下面是一篇关于name()和local-name()函数的文章:

name()和local-name()函数的区别

XPath是一种用于在XML文档中定位元素的语言。在XPath中,name()和local-name()是两个常用的函数,用于获取XML文档中的元素名称。尽管它们的功能相似,但它们之间有一些区别。

name()函数

name()函数返回当前节点的完整名称,包括命名空间前缀(如果有的话)和节点名称。这对于需要获取完整的节点名称的场景非常有用。例如,假设有一个XML文档如下所示:

Harry Potter

如果我们使用XPath表达式"//book"来选取book节点,并使用name()函数获取其名称,那么返回的结果将是"book"。

local-name()函数

local-name()函数返回当前节点的本地名称,即节点名称去除命名空间前缀。这对于忽略命名空间前缀,只关注节点名称的场景非常有用。例如,假设有一个XML文档如下所示:

Harry Potter

如果我们使用XPath表达式"//ns:book"来选取ns:book节点,并使用local-name()函数获取其名称,那么返回的结果将是"book"。

使用案例代码

以下是一个使用name()和local-name()函数的示例代码,用于从XML文档中获取元素名称:

python

import xml.etree.ElementTree as ET

# 解析XML文档

tree = ET.parse('books.xml')

root = tree.getroot()

# 使用XPath表达式选取book节点,并获取其名称

for book in root.findall('.//book'):

print("完整名称:", book.tag)

print("本地名称:", ET.QName(book).localname)

在上面的代码中,我们首先使用XPath表达式".//book"选取所有的book节点。然后,通过调用tag属性获取节点的完整名称,并使用QName类的localname属性获取节点的本地名称。最后,我们将完整名称和本地名称打印出来。

通过运行上述代码,如果XML文档中有如下book节点:

Harry Potter

输出将是:

完整名称: book

本地名称: book

这说明name()函数和local-name()函数返回的结果是相同的。

name()函数和local-name()函数是XPath中用于获取XML文档中元素名称的函数。它们的区别在于name()函数返回完整的节点名称,包括命名空间前缀,而local-name()函数返回去除命名空间前缀的本地名称。根据具体的需求选择合适的函数来获取元素名称,可以更好地处理XML文档中的元素。