博客
关于我
命名空间
阅读量: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/

你可能感兴趣的文章
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>