我编写了一个继承自xml.etree.ElementTree.Element类的类,使用方法扩展该类,以显示etree元素的完整标记名称,以及使用XML替换元素的完整内容的简便方法来自字符串的值..
在新类的 init 方法中,我只想在实例化时将一个etree元素的副本作为参数传递。
首先尝试是:
def __init__(self, elem):
self = elem
然后传递的“元素”的“子标签”列表丢失了。
下面的解决方案有效,但是有一种“更聪明”的方式将完整的“elem”复制到新对象中吗?
import xml.etree.ElementTree as ET
#
# this class allows to replace the content including all subelement of an etree element
# by an XML string content
#
class xmltag(ET.Element):
# constructor
def __init__(self, elem):
self.tag = elem.tag
self.text = elem.text
self.attrib = elem.attrib
self.tail = elem.tail
for s in next(elem.iter()):
self.append(s)
# get string of complete start tag name
def __get_tag_start(self):
tag="<"+self.tag
for k in self.attrib.keys():
tag=tag+" "+k+"=\"" + self.attrib[k] + "\""
return tag+">"
# get string of end tag name
def __get_tag_end(self):
return "</" + self.tag + ">" + (self.tail or "")
# get string of whole content between start and end tag
def get_tag_content(self):
content=self.text or ""
for s in next(self.iter()):
xs=xmltag(s)
content=content+xs.__get_tag_start()
content=content+(xs.text or "")
content=content+xs.__get_tag_end()
return content
# change tag name
def set_tag_name(self,tagname):
self.tag=tagname
# change content
def set_tag_content(self,content):
try:
elem=ET.fromstring(self.__get_tag_start()+content+self.__get_tag_end())
self.clear()
self.tag = elem.tag
self.text = elem.text
self.attrib = elem.attrib
self.tail = elem.tail
for s in next(elem.iter()):
self.append(s)
elem.clear()
except:
pass
#
# testdata
#
xmldata="""<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>"""
#
# MAIN
#
if __name__ == "__main__":
root = ET.fromstring(xmldata)
element=root.find("country")
if ET.iselement(element):
x=xmltag(element)
print(x.get_tag_content())
x.set_tag_content("abc")
print(ET.tostring(x,encoding="unicode"))
x.set_tag_content("EFG")
print(ET.tostring(x,encoding="unicode"))
x.set_tag_name("test")
print(ET.tostring(x,encoding="unicode"))
答案 0 :(得分:0)
这会更正原始__init__()
方法中的错误:
def __init__(self, elem):
self.elem = elem
这会将整个elem
复制到您的实例中,您现在可以访问其属性,例如self.elem.tag
或self.elem.text
。