【问题标题】:How to parse multiple xml files inside a zip file containing multiple subdirectories如何解析包含多个子目录的 zip 文件中的多个 xml 文件
【发布时间】:2022-01-27 19:23:31
【问题描述】:

我必须搜索并打印存储在 zip 文件中的多个 XML 文件的结果。 在这种情况下,我的代码运行良好。但是当 zip 文件包含多个子目录并在 XML 文件中显示时

文件“/usr/lib/python3.10/xml/etree/ElementTree.py”,第 1348 行,XML 返回 parser.close() xml.etree.ElementTree.ParseError:找不到元素:第 1 行,第 0 列

这是我的代码(如果所有 XML 文件都存储在没有任何文件夹的 zip 文件中,则效果很好)

import re
import xml.etree.ElementTree as ET
from zipfile import ZipFile

from utils.xml import SRXMLElements

DEFAULT_ZIP = "./resources/another.zip"


def parse_xml(search_pattern) -> None:
    with ZipFile(DEFAULT_ZIP, "r") as my_zip:
        for file_name in my_zip.namelist():
            with my_zip.open(file_name) as my_file:
                root = ET.fromstring(my_file.read().decode())
                for billSummary in root.iter(SRXMLElements.BillSummaries.value):
                    for text in billSummary.iter(SRXMLElements.Text.value):
                        summary_text = text.text
                        for match in search_pattern.finditer(summary_text):
                            print(text.text)
                            for child in billSummary.iter('RECEIVEDDATE'):
                                print(child.text)
                            


def main() -> None:
   
    
    search_pattern = re.compile("1941012339")
    parse_xml(search_pattern)
  


if __name__ == "__main__":
    main()
from enum import Enum


class SRXMLElements(Enum):
    BillSummaries = "Product"
    Text = "SERVICETAGNUM"


【问题讨论】:

    标签: python xml zip elementtree zipfile


    【解决方案1】:

    namelist 方法不仅返回文件。它还包括目录。因此,您必须检查file_name实际上是一个XML文件还是一个目录。

    这是我的测试 ZIP 文件的内容:

    Archive:  another.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
           30  2022-01-27 20:28   test.xml
            0  2022-01-27 20:28   a/
           30  2022-01-27 20:28   a/test.xml
    ---------                     -------
           60                     3 files
    

    当我们运行以下代码时,我们可以看到,它也输出了目录。

    def parse_xml(search_pattern) -> None:
        with ZipFile(DEFAULT_ZIP, "r") as my_zip:
            for file_name in my_zip.namelist():
                print(file_name)
    

    输出:

    test.xml
    a/
    a/test.xml
    

    好在zipfile还提供了一个特殊的Path类,可以用来检查名字是否真的是一个文件:

    import zipfile
    
    def parse_xml(search_pattern) -> None:
        with ZipFile(DEFAULT_ZIP, "r") as my_zip:
            for file_name in my_zip.namelist():
                if zipfile.Path(my_zip, file_name).is_file():
                    print(file_name)
    

    输出:

    test.xml
    a/test.xml
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 2020-06-07
      • 2017-07-20
      • 2019-12-09
      相关资源
      最近更新 更多