使用Python有效解析大型XML文件

时间:2019-01-21 23:53:04

标签: python xml

我有一个需要解析的350MB XML文件。问题在于它是项目的集合。我将在下面发布完整的示例,但这就像:

<?xml blah blah>
<A>
 <B1>
  <details />
  <subdetails />
 <B2>
  <details />
  <subdetails /?
</A>

问题是我需要遍历所有B级详细信息并保留每个B1组中的所有内容。

尝试使用解析器lxml中内置的熊猫进行解析。对于非常小的XML文件,它运行缓慢且可以,但是对于我真正需要解析的350MB XML文件而言,它却不是那么好。我知道我可能需要etree才能做到这一点。但是,所有此类示例都无法让我在循环中保留足够的信息。这是我的示例XML文件,经过大量修改和简化。

<?xml>
<files>
    <file_info>
        <signature>asdf1234lkjh0987</signature>
        <feed_timestamp>1547716688</feed_timestamp>
        <xml_timestamp>1547719291</xml_timestamp>
    </file_info>
    <file>
        <filename>windows.docx</filename>
        <file_id>10001</file_id>
        <cves>
            <cve>CVE-2018-0123</cve>
            <cve>CVE-2019-1357</cve>
        </cves>
        <bids>
            <bid>111</bid>
        </bids>
        <xrefs>
            <xref>ALPHA:ALPHA-ONE-SEVEN</xref>
        </xrefs>
        <preferences>
        </preferences>
        <attributes>
            <attribute>
                <name>cpe</name>
                <value>cpe:/o:microsoft:etc</value>
            </attribute>
            <attribute>
                <name>cvss_temporal_vector</name>
                <value>CVSS2#E:F/RL:OF/RC:ND</value>
            </attribute>
        </attributes>
    </file>
    <file>
        <filename>windows.xlsx</filename>
        <file_id>10002</file_id>
        <cves>
                <cve>CVE-2018-4567</cve>
            <cve>CVE-2019-9876</cve>
        </cves>
        <bids>
            <bid>222</bid>
        </bids>
        <xrefs>
            <xref>ALPHA:CHARLIE-THREE-CHARLIE</xref>
            <xref>OP:BILLOWY BADGER
        </xrefs>
        <preferences>
        </preferences>
        <attributes>
            <attribute>
                <name>cpe</name>
                <value>cpe:/o:microsoft:etc</value>
            </attribute>
                <attribute>
                <name>cvss_temporal_vector</name>
                <value>CVSS2#E:F/RL:OF/RC:ND</value>
            </attribute>
        </attributes>
    </file>
</files>

我希望能够使用pandas to_excel函数输出包含几个不同表的Excel文件。 file_id是所有这些数据的唯一标识符/主键。

要导出的表格/表格示例:

File_ID  |  CVE
10001    |  CVE-2018-0123
10001    |  CVE-2019-1357
10002    |  CVE-2018-4567
10002    |  CVE-2019-9876

File_ID  |  ALPHA
10001    |  ALPHA-ONE-SEVEN
10002    |  CHARLIE-THREE-CHARLIE

属性是唯一的-每个属性条目一个名称和值标签。每个文件中有多个属性标签。下表将使用File_ID作为唯一键/主键,并列出了所有属于单个项目的内容。示例数据结构:

File_ID  |    Filename    |          CPE           |  CVSS_Temporal_Vector
10001    |  windows.docx  |  cpe:/o:microsoft:etc  |  CVSS2#E:F/RL:OF/RC:ND
10002    |  windows.xlsx  |  cpe:/o:microsoft:etc  |  CVSS2#E:F/RL:OF/RC:ND

0 个答案:

没有答案