解析 XML 并保存为 txt

Parse XML and save as txt

我想解析一个 xml 文件并将其保存为 txt 文件。

我的 XML- 文件如下所示:

我只对 INSTANCE

中的属性 class 感兴趣
<ADOXML adoversion="Version 5.1" username="Admin" database="adoxxdb" time="09:49" date="18.09.2019" version="3.1">
   <MODELS>
      <MODEL version="" applib="ADOxx 1.5 Dynamic Experimentation Library" libtype="bp" modeltype="DSML4VPL" name="DSML4VPL - new (2)" id="mod.29201">
      <INSTANCE name="Online entry point-42200" id="obj.42200" class="Online entry point">
          <ATTRIBUTE name="Position" type="STRING">NODE x:2cm y:4cm index:1</ATTRIBUTE>
          <ATTRIBUTE name="External tool coupling" type="STRING"/>
      </INSTANCE>
     <INSTANCE name="Interact-42206" id="obj.42206" class="**Interact**">
          <ATTRIBUTE name="Position" type="STRING">NODE x:7.5cm y:4cm index:2</ATTRIBUTE>
          <ATTRIBUTE name="External tool coupling" type="STRING"/>
          <ATTRIBUTE name="Comment" type="STRING"/>
          <ATTRIBUTE name="Description" type="STRING"/>
          <ATTRIBUTE name="Open Questions" type="STRING"/>
      </INSTANCE>
     <INSTANCE name="Select-42210" id="obj.42210" class="**Select**">
      <ATTRIBUTE name="Position" type="STRING">NODE x:12.5cm y:4cm index:4</ATTRIBUTE>
          <ATTRIBUTE name="External tool coupling" type="STRING"/>
          <ATTRIBUTE name="Comment" type="STRING"/>
          <ATTRIBUTE name="Description" type="STRING"/>
          <ATTRIBUTE name="Open questions" type="STRING"/>
    </INSTANCE>


    </MODEL>
  </MODELS>
</ADOXML>

我只想在 txt.file

中写下每个 class,例如 "Online entry point" 或 "Interact"

输出应该看起来像

Klassen
Online entry point
Interact
Select

我的代码如下所示:

import xml.etree.ElementTree as ET
tree=ET.parse("test1.xml")
root=tree.getroot()    
with open("file3.txt","w")as f:
        f.write("Class\n")
    for xclass in root.findall("MODEL"):
        Klasse=xclass.find("INSTANCE").get("class")
        line_to_write=Klasse
        with open("file3.txt","a") as f:
            f.write(line_to_write)

但是,我现在不知道我做错了什么,没有错误信息,只是一个 txt.file 和 Class 里面。

问题是 findall 只搜索给定标签名称的元素的直接后代:ElementTree findall() returning empty list.

您可以简单地浏览所有元素标签和 select 您正在寻找的属性。

import xml.etree.ElementTree as ET
tree=ET.parse("test1.xml")
root=tree.getroot() 

# Get "class" attribute of "INSTANCE" tags.
line_to_write = []
for xclass in root.iter("INSTANCE"):
    line_to_write.append(xclass.get("class"))

# Writing to a file with space as delimiter
with open("file3.txt","w")as f:
    f.write("Class\n")
    f.write(" ".join([str(word) for word in line_to_write]))

我认为你很接近。

有几件事我不确定...

  • 为什么要遍历 MODEL?能有不止一个吗?每个 MODEL 都应该是一个单独的文本文件吗?
  • 为什么要再次尝试打开文本文件?

根据您当前的示例,您应该能够使用 findall(".//INSTANCE") 遍历每个 INSTANCE 元素。

这是一个使用您提供的示例生成您请求的输出的示例...

import xml.etree.ElementTree as ET

tree = ET.parse("test1.xml")

with open("file3.txt", "w")as f:
    f.write("Class\n")
    for instance in tree.findall(".//INSTANCE"):
        f.write(f"{instance.get('class')}\n")

我仍在写作和思考同样的问题,但现在我有了不同的目标。但是几乎是同样的问题,但我做不对。

我的 xml 文件如下所示:

<ADOXML adoversion="Version 5.1" username="Admin" database="adoxxdb" time="10:39" date="21.10.2019" version="3.1">
<MODELS>
<MODEL version="" applib="ADOxx 1.5 Dynamic Experimentation Library" libtype="bp" modeltype="Ressource Model" name="Ressource Model - new" id="mod.47204">
<MODELATTRIBUTES>
<INSTANCE name="Collection of written documents-49041" id="obj.49041" class="Collection of written documents">
<ATTRIBUTE name="Position" type="STRING">NODE x:7cm y:1.5cm index:1</ATTRIBUTE>
<ATTRIBUTE name="External tool coupling" type="STRING"/>
<ATTRIBUTE name="Comment" type="STRING"/>
<ATTRIBUTE name="Description" type="STRING"/>
<ATTRIBUTE name="Referenced Document" type="PROGRAMCALL">ITEM "" param:""</ATTRIBUTE>
<ATTRIBUTE name="Display file name" type="INTEGER">0</ATTRIBUTE>
<ATTRIBUTE name="Type of written documents" type="ENUMERATIONLIST">Demonstration;Portfolio</ATTRIBUTE>
</INSTANCE>
</MODEL>
</MODELS>
</ADOXML

我只对 class ATTRIBUTE 中的 type 属性感兴趣。我只想在文本文件

中显示值 DemonstrationPortfolio

我的代码:

import xml.etree.ElementTree as ET
tree=ET.parse(r"C:\Users\benni\Google Drive\MASTER\Masterarbeit\Coden\Resource.xml")
with open(r"C:\Users\benni\Google Drive\MASTER\Masterarbeit\Coden\Output88.txt", "w")as f:
    f.write("Class\n")
    for instance in tree.findall(".//ATTRIBUTE"):
        f.write(f"{instance.get('type')}\n")

我知道这是同样的问题,但是,我找不到正确的方法或正确的路径来获取仅包含单词 Demonstration投资组合