在创建时向lxml.etree.Element添加尾部

时间:2016-03-05 04:13:24

标签: python xml lxml

我知道我可以按照以下方式对元素进行尾随:

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.

1 个答案:

答案 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 的属性指定为额外的命名参数。但是,我们仍然可以通过将其添加到属性映射来指定它。