在Python中解析大型XML文件

时间:2018-04-01 12:15:16

标签: python xml python-3.x celementtree

需要一些帮助。我们有一个来自API的大型XML文件,我需要将其转换为SQL Server表。使用pyodbc将表加载到SQL中是没有问题的,但我正在努力解析16mb XML文件。文件格式正确 - 它包含在单个根目录中。我已经找了几个星期的解决方案,而且我已经能够通过它来试错。任何帮助表示赞赏。

简而言之,目标是以表格格式输出XML文件中包含的所有值,其中每个记录都列在其中。自己的行。 XML的Address和Space部分需要对子元素进行适当的处​​理。我有代码可行,但我不认为这是"适当的"解析值的方法:

var myArr = ["a", "b", "c", "d"];

myArr.forEach((val, key) => {
  randomIndex = Math.ceil(Math.random()*(key + 1));
  myArr[key] = myArr[randomIndex];
  myArr[randomIndex] = val;
});
// see the values
console.log('Shuffled Array: ', myArr)

以下是我使用的XML的一个示例:

import xml.etree.ElementTree as ET
tree = ET.parse('Z:\\FileLoc\\DealData.xml')
root = tree.getroot()
    for prop in deals[0]:
    for addr1 in prop[4].iter(tag="Street"):
        for addr2 in prop[4].iter(tag="City"):
            for addr3 in prop[4].iter(tag="State"):
                for addr4 in prop[4].iter(tag="PostalCode"):
                    for addr5 in prop[4].iter(tag="Country"):
                        for spaces in prop[5]:
                                print(deals.attrib.get("DealID"), prop.attrib.get("ID"),
                                   prop[0].text[0:5], prop[0].text[6:],
                                   addr1.text, addr2.text, addr3.text, addr4.text, addr5.text,
                                   spaces.attrib.get("ID"))

1 个答案:

答案 0 :(得分:4)

据我所知,使用XML中的大文件没有问题。您可以将xml.etree.ElementTree用于您的数据。我测试了以下代码,它可以工作(解析和打印):

import xml.etree.ElementTree as ET
tree = ET.parse('data.xml')
root = tree.getroot()

def deepParsing(node, pre=None):
    if pre is None:
        pre = '-'
    print(' ')
    print(pre + '> Tag:',node.tag)
    print(pre + '> Attributes:', node.attrib)
    print(pre + '> Text:', node.text)

    pre += '-'
    for key in node:
        deepParsing(key, pre)
deepParsing(root)

您的数据是根据给定的树打印在控制台上的。

修改: 您的示例缺少结束标记:

    </Deals>
</DealExport>

在xml的末尾。

祝你好运!