18

如何从其构造函数设置 ElementTree Element 的文本字段?或者,在下面的代码中,为什么 root.text 的第二个打印是 None?

import xml.etree.ElementTree as ET

root = ET.fromstring("<period units='months'>6</period>")
ET.dump(root)
print root.text

root=ET.Element('period', {'units': 'months'}, text='6')
ET.dump(root)
print root.text

root=ET.Element('period', {'units': 'months'})
root.text = '6'
ET.dump(root)
print root.text

这里的输出:

<period units="months">6</period>
6
<period text="6" units="months" />
None
<period units="months">6</period>
6
4

3 回答 3

13

构造函数不支持它:

class Element(object):
    tag = None
    attrib = None
    text = None
    tail = None

    def __init__(self, tag, attrib={}, **extra):
        attrib = attrib.copy()
        attrib.update(extra)
        self.tag = tag
        self.attrib = attrib
        self._children = []

如果您text作为关键字参数传递给构造函数,您将为text元素添加一个属性,这就是您的第二个示例中发生的情况。

于 2013-08-07T02:57:52.583 回答
5

构造函数不允许这样做,因为他们认为让每个属性都foo=bar添加一个属性是不合适的,除了随机的两个:texttail

如果您认为这是删除构造函数舒适度的愚蠢理由(就像我一样),那么您可以创建自己的元素。我做到了。我将它作为子类并添加了一个parent参数。这使您仍然可以将它与其他所有东西一起使用!

蟒蛇 2.7:

import xml.etree.ElementTree as ET

# Note: for python 2.6, inherit from ET._Element
#       python 2.5 and earlier is untested
class TElement(ET.Element):
    def __init__(self, tag, text=None, tail=None, parent=None, attrib={}, **extra):
        super(TextElement, self).__init__(tag, attrib, **extra)

        if text:
            self.text = text
        if tail:
            self.tail = tail
        if not parent == None:   # Issues warning if just 'if parent:'
            parent.append(self)

蟒蛇2.6:

#import xml.etree.ElementTree as ET

class TElement(ET._Element):
    def __init__(self, tag, text=None, tail=None, parent=None, attrib={}, **extra):
        ET._Element.__init__(self, tag, dict(attrib, **extra))

        if text:
            self.text = text
        if tail:
            self.tail = tail
        if not parent == None:
            parent.append(self)
于 2014-05-14T16:13:59.110 回答
0

从 API 设计的角度来看,extra并且attrib是多余的,它们应该放在text里面tailextra

即,他们应该从以下位置更改库代码:

class Element(object):
    tag = None
    attrib = None
    text = None
    tail = None

    def __init__(self, tag, attrib={}, **extra):
        attrib = attrib.copy()
        attrib.update(extra)
        self.tag = tag
        self.attrib = attrib
        self._children = []

进入:

class Element(object):
    tag = None
    attrib = None
    text = None
    tail = None

    def __init__(self, tag, attrib={}, **extra):
        attrib = attrib.copy()
        self.tag = tag
        self.text = extra.get('text',None)
        self.tail = extra.get('tail',None)
        self.attrib = attrib
        self._children = []

无论如何,使用 XML 存储数据结构已经被弃用了,因为 JSON 更加高效和优雅。今天使用 XML 的唯一原因是遗留的原因:太多的现有库仍在使用它。

于 2021-12-15T04:52:13.263 回答