How to set ElementTree Element text field in the constructor

自闭症网瘾萝莉.ら 提交于 2019-12-04 02:50:12

问题


How do I set the text field of of ElementTree Element from its constructor? Or, in the code below, why is the second print of 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

Here the output:

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

回答1:


The constructor doesn't support it:

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 = []

If you pass text as a keyword argument to the constructor, you will add a text attribute to your element, which is what happened in your second example.




回答2:


The constructor does not allow for it because they thought that it would be improper to have every foo=bar add an attribute except for the random two: text and tail

If you think this is a dumb reason to remove constructor comforts (as I do) then you can create your own element. I did. I have it as a subclass and added a parent parameter. This allows you to still use it with everything else!

Python 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)

Python 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)


来源:https://stackoverflow.com/questions/18093843/how-to-set-elementtree-element-text-field-in-the-constructor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!