在另一个 class ElementTree Python 中继续解析
Continue a parsing in another class ElementTree Python
在我的第一个 class 中,我像这样解析我的 xml 文件:
class ListActeurs():
fonction_key = "DiagramElements"
def __init__(self):
self.list_acteurs = []
root = ElementTree.parse("D:\Users\T0211254\MyApp\Bundle CUD-CAPELLA 431\melody\eclipse\workspace\XML2\XML2.aird").getroot()
for diagram in self.root:
if ListActeurs.diagramme_key in diagram.tag:
self.diagram_name = diagram.attrib.get('name')
self.diagram_id = diagram.get('{http://www.omg.org/XMI}id')
self.dict_diagrams[self.diagram_name] = self.diagram_id
for owned in diagram:
if ListActeurs.acteur_key in owned.tag:
self.acteur_name = owned.attrib.get('name') # Récupération des noms des acteurs
self.acteur_id = owned.get('{http://www.omg.org/XMI}id') # Récupération des id's des acteurs
print(self.acteur_name, '==>', self.acteur_id)
for elements in owned:
if ListActeurs.fonction_key in elements.tag:
self.fonctions_name = elements.attrib.get('name') # Récupération des noms des fonctions
self.fonctions_id = elements.get('{http://www.omg.org/XMI}id') # Récupération des ID's des fonctions
self.data_fonctions = ElementTree.tostring(elements)
self.list_acteurs.append(Acteur(self.fonctions_name, self.fonctions_id, self.data_fonctions))
最后,我创建了一个具有不同属性的对象 Acteur(),包括 "self.data_fonction",它在字符串变量中包含 xml 文件的一部分。
我想在另一个class中继续解析xml的这一部分。我试过了:
class Acteur() :
def __init__(self, fonctions_name, fonctions_id, data_fonctions):
self.fonctions_name = str(fonctions_name)
self.fonctions_id = str(fonctions_id)
self.data_fonctions = str(data_fonctions)
elements = ET.ElementTree(ET.fromstring(data_fonctions))
for ports in elements :
ports_name = ports.attrib.get('name')
print(ports_name)
但是出现错误:
for ports in elements :
TypeError: 'ElementTree' object is not iterable
但是我不能使用 ElementTree 函数 parse() 因为它不再是一个文件。我怎样才能做到这一点 ?我想创建一个 xml 文件并将 "self.data_fonction" 放入其中并解析此 xml 文件,但是有没有更好的方法来做到这一点?
谢谢
根据文档:https://docs.python.org/2/library/xml.etree.elementtree.html
在解析 xml 文件时您创建了 ElementTree 对象。
您必须使用 ElementTree 对象的实例('root' 在您的代码示例中)才能迭代。
所以基本上只需使用:
for child in root:
print child.tag, child.attrib
而不是:
elements = ET.ElementTree(ET.fromstring(data_fonctions))
for ports in elements :
ports_name = ports.attrib.get('name')
print(ports_name)
好的,我找到了! data_fonctions 是一个字节对象,我刚刚对其进行了编码:
self.data_fonctions = ElementTree.tostring(elements)
self.data_fonctions_string = self.data_fonctions.decode("utf-8")
使其成为字符串并将其放入变量中。所以我可以 ET.fromstring() 这个变量到我的 xml 代码部分!
在我的第一个 class 中,我像这样解析我的 xml 文件:
class ListActeurs():
fonction_key = "DiagramElements"
def __init__(self):
self.list_acteurs = []
root = ElementTree.parse("D:\Users\T0211254\MyApp\Bundle CUD-CAPELLA 431\melody\eclipse\workspace\XML2\XML2.aird").getroot()
for diagram in self.root:
if ListActeurs.diagramme_key in diagram.tag:
self.diagram_name = diagram.attrib.get('name')
self.diagram_id = diagram.get('{http://www.omg.org/XMI}id')
self.dict_diagrams[self.diagram_name] = self.diagram_id
for owned in diagram:
if ListActeurs.acteur_key in owned.tag:
self.acteur_name = owned.attrib.get('name') # Récupération des noms des acteurs
self.acteur_id = owned.get('{http://www.omg.org/XMI}id') # Récupération des id's des acteurs
print(self.acteur_name, '==>', self.acteur_id)
for elements in owned:
if ListActeurs.fonction_key in elements.tag:
self.fonctions_name = elements.attrib.get('name') # Récupération des noms des fonctions
self.fonctions_id = elements.get('{http://www.omg.org/XMI}id') # Récupération des ID's des fonctions
self.data_fonctions = ElementTree.tostring(elements)
self.list_acteurs.append(Acteur(self.fonctions_name, self.fonctions_id, self.data_fonctions))
最后,我创建了一个具有不同属性的对象 Acteur(),包括 "self.data_fonction",它在字符串变量中包含 xml 文件的一部分。
我想在另一个class中继续解析xml的这一部分。我试过了:
class Acteur() :
def __init__(self, fonctions_name, fonctions_id, data_fonctions):
self.fonctions_name = str(fonctions_name)
self.fonctions_id = str(fonctions_id)
self.data_fonctions = str(data_fonctions)
elements = ET.ElementTree(ET.fromstring(data_fonctions))
for ports in elements :
ports_name = ports.attrib.get('name')
print(ports_name)
但是出现错误:
for ports in elements :
TypeError: 'ElementTree' object is not iterable
但是我不能使用 ElementTree 函数 parse() 因为它不再是一个文件。我怎样才能做到这一点 ?我想创建一个 xml 文件并将 "self.data_fonction" 放入其中并解析此 xml 文件,但是有没有更好的方法来做到这一点?
谢谢
根据文档:https://docs.python.org/2/library/xml.etree.elementtree.html
在解析 xml 文件时您创建了 ElementTree 对象。 您必须使用 ElementTree 对象的实例('root' 在您的代码示例中)才能迭代。
所以基本上只需使用:
for child in root:
print child.tag, child.attrib
而不是:
elements = ET.ElementTree(ET.fromstring(data_fonctions))
for ports in elements :
ports_name = ports.attrib.get('name')
print(ports_name)
好的,我找到了! data_fonctions 是一个字节对象,我刚刚对其进行了编码:
self.data_fonctions = ElementTree.tostring(elements)
self.data_fonctions_string = self.data_fonctions.decode("utf-8")
使其成为字符串并将其放入变量中。所以我可以 ET.fromstring() 这个变量到我的 xml 代码部分!