博客
关于我
命名空间
阅读量:502 次
发布时间:2019-03-07

本文共 3739 字,大约阅读时间需要 12 分钟。

ElementTree API在设计时,尽量避免使用前缀,而是通过命名空间(URI)来管理标签的命名空间。这种做法有助于在处理不同文档时,确保代码的清晰性和准确性。

创建带前缀和命名空间的XML树

当使用命名空间http://www.w3.org/1999/xhtml时,ElementTree会自动创建前缀html,并将其与命名空间关联。若提供的URL不正确,ElementTree会自动生成默认的前缀ns0,这样可以避免命名空间解析时的错误。

from lxml import etree# 使用命名空间时,ElementTree会自动处理前缀html_element = etree.Element("{http: www.w3.org 1999 xhtml}html")body = etree.SubElement(html_element, "{http: xhtml}body")body.text = "Hello World"print(etree.tostring(html_element, pretty_print=True))

输出结果如下:

Hello World

ElementTree的命名空间管理

ElementTree最初由James Clark提出,其主要优势在于能够无缝处理不同文档中的命名空间,无论文档是否定义了前缀。这种机制使得代码更加清晰和可靠。

命名空间的使用与管理

在实际应用中,命名空间的定义可能会变得非常长。为了避免代码冗长,通常会将命名空间存储在全局变量中。

from lxml import etreeXHTML_NAMESPACE = "http://www.w3.org/1999/xhtml"XHTML = "{%s}" % XHTML_NAMESPACENSMAP = {'prefix_test': XHTML_NAMESPACE}# 创建带命名空间的元素html_element = etree.Element(XHTML + "html", nsmap=NSMAP)body = etree.SubElement(html_element, XHTML + "body")body.text = "Hello World"print(etree.tostring(html_element, pretty_print=True))

输出结果如下:

Hello World

QName助手类的使用

QName助手类可以帮助开发者生成或拆分限定标签名称。它支持两种主要操作方式:

from lxml import etree# 生成限定标签名称tag = etree.QName('http://www.w3.org/1999/xhtml', 'html')print(tag.localname)  # 输出: htmlprint(tag.namespace)  # 输出: http://www.w3.org/1999/xhtml# 生成带命名空间的标签名称tag = etree.QName('{http://www.w3.org/1999/xhtml}html')print(tag.localname)  # 输出: htmlprint(tag.namespace)  # 输出: http://www.w3.org/1999/xhtml# 创建带命名空间的元素root = etree.Element('{http://www.w3.org/1999/xhtml}html')tag = etree.QName(root)print(tag.localname)  # 输出: html# 生成子元素的限定标签名称tag = etree.QName(root, 'script')print(tag.text)  # 输出: {http://www.w3.org/1999/xhtml}scripttag = etree.QName('{http://www.w3.org/1999/xhtml}html', 'script')print(tag.text)  # 输出: {http://www.w3.org/1999/xhtml}script

命名空间映射的应用

ElementTree允许通过nsmap属性来管理命名空间。这个属性不仅支持元素本身定义的命名空间,还包括上下文中已知的所有前缀。

from lxml import etreeroot = etree.Element('root', nsmap={    'a': 'http://a.b/c'})child = etree.SubElement(root, 'child', nsmap={    'b': 'http://b.c/d'})print(root.nsmap)  # 输出: {'a': 'http://a.b/c'}print(child.nsmap)  # 输出: {'b': 'http://b.c/d'}# 修改映射不会影响元素本身child.nsmap['b'] = 'test'print(child.nsmap['b'])  # 输出: 'http://b.c/d'

属性中的命名空间

属性中的命名空间在ElementTree中遵循XML名称空间规范。从2.3版开始,ElementTree确保属性使用带前缀的命名空间声明。这是因为未固定属性名在名称空间中没有意义,可能会在序列化和解析过程中丢失。

from lxml import etreeXHTML_NAMESPACE = "http://www.w3.org/1999/xhtml"XHTML = "{%s}" % XHTML_NAMESPACENSMAP = {'prefix_test': XHTML_NAMESPACE}html_element = etree.Element(XHTML + "html", nsmap=NSMAP)body = etree.SubElement(html_element, XHTML + "body")body.text = "Hello World"body.set(XHTML + "bgcolor", "#CCFFAA")print(etree.tostring(html_element, pretty_print=True))# 获取属性值print(body.get("bgcolor"))  # 输出: Noneprint(body.get(XHTML + "bgcolor"))  # 输出: #CCFFAA# 使用XPath查找带命名空间的元素find_xhtml_body = etree.ETXPath("//{%s}body" % XHTML_NAMESPACE)results = find_xhtml_body(html_element)print(results[0].tag)  # 输出: {http://www.w3.org/1999/xhtml}body# 使用通配符查找所有元素for el in html_element.iter('*'):    print(el.tag)  # 输出: {http://www.w3.org/1999/xhtml}html, {http://www.w3.org/1999/xhtml}body# 使用限定标签名查找元素for el in html_element.iter('{http://www.w3.org/1999/xhtml}*'):    print(el.tag)  # 输出: {http://www.w3.org/1999/xhtml}html, {http://www.w3.org/1999/xhtml}body# 查找没有命名空间的元素print([el.tag for el in html_element.iter('body')])  # 输出: []print([el.tag for el in html_element.iter('{}body') ])  # 输出: []print([el.tag for el in html_element.iter('{}*') ])  # 输出: []

总结

ElementTree API通过使用命名空间而不是前缀,提供了一种更加灵活和可靠的方式来处理XML标签。命名空间的管理可以显著提高代码的可维护性和可读性。通过合理使用nsmap和QName助手类,可以更方便地处理带命名空间的XML树。此外,ElementTree在属性处理和XPath查询中都提供了强大的命名空间支持,帮助开发者更高效地管理复杂的XML文档。

转载地址:http://ycicz.baihongyu.com/

你可能感兴趣的文章
python与图灵机器人交互(WXPY版本)
查看>>
python与运算符_python运算符
查看>>
python两个列表获取交集,并集,差集
查看>>
python两个字典合并,两个list合并
查看>>
Python两个版本共存时,命令行升级pip
查看>>
Python两个版本共存时,怎么验证是否安装成功 scrapy
查看>>
Python两个版本共存时,通过pip安装Scrapy
查看>>
python两组变量的相关关系散点图_变量是什么?变量间的两种关系——函数关系和相关关系(小学版)...
查看>>
Python中 pass语句的作用
查看>>
python中 urllib, urllib2, httplib, httplib2 几个库的区别
查看>>
python中 yaml库 & json库 & xmltodict库使用
查看>>
python中 将你的名字转化成为二进制并输出
查看>>
Python中*args 和**kwargs的用法
查看>>
Python中*args 和**kwargs的用法
查看>>
Python中*args和**kwargs的使用
查看>>
python中0、1、True、False、if条件
查看>>
python中argparse模块关于 parse_args() 函数详解(全)
查看>>
python中base64编码与解码
查看>>
python中break怎么用_详解Python中break语句的用法
查看>>
python中del函数的垃圾回收
查看>>