我知道我可以按照以下方式对元素进行尾随:
tag = ET.Element(category, attrib=new_tag)
tag.tail= '\n'
是否可以在实例化期间添加它? E.g:
ET.Element(category, attrib=new_tag, tail='\n') # adds a "tail" attribute instead.
答案 0 :(得分:2)
不幸的是,这是不可能的。查看实际的源代码,这个Element构建方法包含在文件 lxml.etree.pyx 中,并且很简单(没有docstring)
def Element(_tag, attrib=None, nsmap=None, **_extra):
return _makeElement(_tag, NULL, None, None, None, None, attrib, nsmap, _extra)
跟踪此_makeElement
方法,我们在 apihelpers.pxi 中找到它,并将其声明为
cdef _Element _makeElement(tag, xmlDoc* c_doc, _Document doc,
_BaseParser parser, text, tail, attrib, nsmap,
dict extra_attrs):
因此,行为与ElementTree中的行为完全相同,我们可以定义标签名称,属性字典,命名空间映射(这与元素树不同),以及将添加到的其他属性列表属性图。这里需要注意的一点是,Element构造函数作为lxml中的函数提供,与ElementTree的等效类不同。
Element
函数不能使用任何额外的位置参数,任何其他关键字参数都用作元素中的属性。根本没有办法将尾部的值传递给元素构造函数。 _makeElement
方法是私有api的一部分,没有简单的方法来访问它,但是如果可以访问它,这可以提供一种方法(注意这个函数为尾部赋值)
当然,如果我们需要这样的功能,我们没有理由不写这样的功能。 †
def TailedElement(tag,attrib=None,nsmap=None,tail=None,**extra):
x = ET.Element(tag,attrib,nsmap,**extra)
x.tail = tail
return x
证明这一点,
test = TailedElement("testel",{"testing":"yes"},tail="Tail Value")
ET.tostring(test)
# b'<testel testing="yes"/>Tail Value'
† 对此有一个小小的权衡。我们不能再将名为 tail 的属性指定为额外的命名参数。但是,我们仍然可以通过将其添加到属性映射来指定它。