2013-08-07 15 views
10

ElementTree Öğesinin metin alanını kurucusundan nasıl ayarlayabilirim? Ya da aşağıdaki kodda, neden root.text'in ikinci baskısı yok? İşteKurucuda ElementTree Element metin alanı nasıl ayarlanır

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 

çıkışı:

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

cevap

7

yapıcı bunu desteklemez: Eğer yapıcı bir keyword argüman olarak text geçerseniz

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

, bir text katacak İkinci örneğinizde olan, öğenize öznitelik.

onlar her foo=bar haricinde bir özelliği eklemelerini olması uygunsuz olacağını düşündüğü için yapıcı buna izin vermez
+1

teşekkürler! (Dökümantasyon yerine kodu okumalıydım!) –

3

rastgele iki: text ve tail

bu yapıcı kaldırmak için bir aptal nedeni olduğunu düşünüyorsanız Konfor (benim yaptığım gibi) sonra kendi elementinizi yaratabilirsiniz. Yaptım. Bunu bir alt sınıf olarak aldım ve parent parametresini ekledim. Bu onu hala başka her şeyle kullanmanıza izin veriyor!

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)