[英]Distinguishing between <foo/> and <foo></foo> in Python XML parsing and generation
我一直在使用Python的ElementTree创建XML文档,到目前为止,一切都很好。 但是,我现在面临的问题是,由于项目要求,我需要生成一个XML文档,该文档包含带有开始和结束标签以及自闭合标签元素的元素。 我需要输出带有开始/结束标签的空标签,并保留自封闭标签元素。 当前实现要么在元素为空时生成自动关闭标签,然后保留自动关闭标签,但由于项目要求,这是不正确的。 另外,如果我为空元素强制使用开始/结束标签,则自动关闭标签也将转换为开始/结束标签元素,这也不正确。
有人可以帮我一下,为我指出一个可能的解决方案,欢迎提出任何建议。 我需要使用Python 2.7。 谢谢。
就XML标准而言,空标签的含义与自动关闭标签的含义完全相同。
因此,首先,这可能不是一个好主意。
其次,大多数XML库可能不会让您区分两者。
但是,如果需要执行此操作,则始终可以修补所需的任何库。 由于您已经在使用ElementTree
,因此似乎是进行修补的明显选择。
在ElementTree
的最新版本中(包括Python 3.4+附带的版本,但是在较旧的Python中,您需要安装最新的外部维护版本),您实际上可以使用short_empty_elements
参数进行write
和相关控制,以全局方式进行控制。职能。 但是,正如您所说,这并不是您真正想要的。 您需要一些元素可以自动关闭,而有些则不需要。
我认为您最好从ElementTree
的外部维护版本开始,而不是从Python 2.7内置的版本开始。 但是我不确定它的官方仓库在哪里,所以我将链接到Python 3.4代码。 希望这能给您足够的帮助。
关键功能是serialize_xml
。 我认为该函数不是C加速的,因此您只需要更改纯Python版本。 在这种情况下,只有一行:
if text or len(elem) or not short_empty_elements:
更改为:
if text or len(elem) or not getattr(elem, 'short_empty', short_empty_elements):
现在,如果您在一个空节点上设置node.short_empty = True
或node.short_empty = False
,它将覆盖short_empty_elements
的全局设置。
除了…我认为,如果您使用的是C加速器,则无法将属性(我的意思是Python属性,例如node.short_empty
,而不是XML属性)添加到Element
。 这意味着你要么需要修补Element
允许的(这部分是用C -you'll有没有禁用__dict__
和修改else
调用PyObject_GenericSetAttr
而不是提高),或捏造事实,例如,使用一些假的XML属性,在序列化时将其删除。
当然,如果您在2.7中使用的是ElementTree
而不是cElementTree
,则您没有使用C加速器,因此您可能不必担心这部分。
您可能需要考虑查看ElementTree
API的lxml
实现,以查看是否更易于修补。
同时,考虑到他们已将short_empty_elements
添加到库中,维护人员可能会对在上游接受您的补丁感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.