Продолжить разбор в другом классе ElementTree Python - PullRequest
1 голос
/ 22 марта 2019

В моем первом классе я анализирую свой 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))

В конце я создаю Object Acteur () с различными атрибутами, включая «self.data_fonction», который содержит часть XML-файла в строковой переменной.

Я бы хотел продолжить анализ этой части 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, но есть ли лучший способ сделать это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Хорошо, я нашел! data_fonctions был байтовым объектом, я просто закодировал его:

self.data_fonctions = ElementTree.tostring(elements)
self.data_fonctions_string = self.data_fonctions.decode("utf-8") 

чтобы сделать его String и поместить его в переменную. И поэтому я могу ET.fromstring () эту переменную для моей части кода XML!

0 голосов
/ 22 марта 2019

Согласно документации: 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)
...