代码之家  ›  专栏  ›  技术社区  ›  Franck Dernoncourt

向lxml.etree添加尾部。创建时的元素

  •  2
  • Franck Dernoncourt  · 技术社区  · 9 年前

    我知道我可以按如下方式跟踪元素:

    tag = ET.Element(category, attrib=new_tag)
    tag.tail= '\n'
    

    是否可以在实例化期间添加它?例如。:

    ET.Element(category, attrib=new_tag, tail='\n') # adds a "tail" attribute instead.
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Matthew    9 年前

    不幸的是,这是不可能的。查看实际的源代码,这个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 方法,我们在 api助手.pxi ,并声明为

    cdef _Element _makeElement(tag, xmlDoc* c_doc, _Document doc,
                           _BaseParser parser, text, tail, attrib, nsmap,
                           dict extra_attrs):
    

    因此,行为与ElementTree完全相同,我们可以定义标记名、属性字典、名称空间映射(这与元素树不同)以及将添加到属性映射的其他属性列表。这里需要注意的一点是,Element构造函数在lxml中作为函数提供,与ElementTree的等效类不同。

    这个 Element 函数不能接受任何额外的位置参数,并且任何额外的关键字参数都用作元素中的属性。根本无法将尾部的值传递给元素构造函数。这个 _make元素 方法是私有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'
    

    这有一个小的权衡。我们无法再指定名为 作为额外的命名参数。然而,我们仍然可以通过将其添加到属性映射中来指定它。