Python: lxml 并非一直在读取元素文本

Python: lxml is not reading element text all time

我想将具有以下结构的 xml 文件加载到 pandas 数据帧中

xml 的大小可能在 1 GB 到 6GB 之间

下面的 xml 示例只有 5 条记录,但我的实际文件将有大约 100000 条记录,如下面的 RECORDS 属性 (RECORDS="108881")

此外,此文件中的每个元素都将具有一定的价值。 None 元素在整个文件中为空。

<?xml version="1.0" encoding="UTF-8"?>
<ACADEMICS>  
   <STUDENTS ASOF_DATE="11/21/2019" CREATE_DATE="11/22/2019" RECORDS="108881">      
    <STUDENT>      
        <NAME>JOHN</NAME>      
        <REGNUM>1000</REGNUM>      
        <COUNTRY>USA</COUNTRY>      
        <ID>JH1</ID>
        <SHORT_STD_DESC>JOHN IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>ADAM</NAME>      
        <REGNUM>1001</REGNUM>      
        <COUNTRY>FRANCE</COUNTRY>      
        <ID>AD2</ID>
        <SHORT_STD_DESC>ADAM IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>PETER</NAME>      
        <REGNUM>1003</REGNUM>      
        <COUNTRY>BELGIUM</COUNTRY>      
        <ID>PE5</ID>
        <SHORT_STD_DESC>PETER IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>ERIC</NAME>      
        <REGNUM>1006</REGNUM>      
        <COUNTRY>AUSTRALIA</COUNTRY>      
        <ID>ER7</ID>
        <SHORT_STD_DESC>ERIC IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>NICHOLAS</NAME>      
        <REGNUM>1009</REGNUM>      
        <COUNTRY>GREECE</COUNTRY>      
        <ID>NI8</ID>
        <SHORT_STD_DESC>NICHOLAS IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
</STUDENTS>

我正在尝试使用 lxml 阅读这些 xmls,如下所示 正如您在下面的函数中看到的,我只对从 xml 文件中读取特定标签感兴趣,这些标签是 ["ACADEMICS"、"STUDENDS"、"ID"、"SHORT_STD_DESC"]

def recursive_dict(self,element):
        return element.tag, \
            dict(map(self.recursive_dict, element)) or element.text

def ConvertFilePivot(self, inputfile):        
        context = etree.iterparse(inputfile, events=('start','end'), tag=["ACADEMICS","STUDENDS","ID","SHORT_STD_DESC"])
        lstValues = []
        asOfDate = ""
        for event, elem in context:
            if elem.tag == "ACADEMICS" :
                asOfDate = elem[0].attrib['ASOF_DATE']
            else:        
                for event, elem in context:                                          
                    doc = self.recursive_dict(elem)                                   
                    lstValues.append(doc)                
                dfvalues = pd.DataFrame(lstValues,columns=["ColName","ColValue"])
                columns = dfvalues['ColName'].unique()
                data = {}
                for column in columns:
                    data[column] = list(dfvalues[dfvalues['ColName'] == column]['ColValue'])

        dfdata = pd.DataFrame(data)        
        return dfdata

现在,问题是当我将这个 xml 加载到数据框中时,如上面的函数所示,对于某些记录,我得到 'None' 作为 ID 和 SHORT_STD_DESC 元素的文本。 但实际的 xml 文件具有该值。 所以我不确定为什么它没有反映在我的数据框中? 任何输入都会对我有很大帮助。

这可能更像是评论而不是答案,但我无法将其放入实际评论中...

尝试更改

 else:        
     for event, elem in context:                                          
           doc = self.recursive_dict(elem)    

只是:

 else:             
     doc = self.recursive_dict(elem)    

看看它是否有效。