【问题标题】:Continue a parsing in another class ElementTree Python在 Python 的另一个类 ElementTree 中继续解析
【发布时间】:2019-03-22 12:56:29
【问题描述】:

在我的第一堂课中,我像这样解析我的 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 文件,但有没有更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: python xml parsing elementtree xml.etree


    【解决方案1】:

    根据文档:https://docs.python.org/2/library/xml.etree.elementtree.html

    在解析 xml 文件时,您已经创建了 ElementTree 对象。 您必须使用 ElementTree 对象的实例(代码示例中的“根”)才能进行迭代。

    所以基本上只使用:

    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)
    

    【讨论】:

    • 如果我没记错的话,它会再次解析整个 xml 文件,而不仅仅是包含 xml 文件一小部分的“data_fonctions”?
    • 因为你已经有了包含 xml 的 'root' 对象,你不会再解析 xml 了。
    • 我已经编辑了我的代码。我的意思是,如果我从头(根)重新开始,我必须再次开发我的树,直到“元素”分支。我想我可能不明白你的观点。
    【解决方案2】:

    好的,我找到了! data_fonctions 是一个字节对象,我刚刚对其进行了编码:

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

    将其设为字符串并将其放入变量中。所以我可以 ET.fromstring() 这个变量到我的部分 xml 代码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多