Python:lxml没有完全读取元素文本

2024-10-05 11:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

下面的xml示例只有5条记录,但我的acutal文件将有大约100000条记录,如下面的记录属性所述(records=“108881”)

此外,这个文件中的每个元素都会有一些值。 整个文件中没有一个元素为空

<?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阅读这些xml,如下所示 正如您在下面的函数中所看到的,我只是对从xml文件中读取特定的标记感兴趣,这些标记是[“ACADEMICS”,“STUDENDS”,“ID”,“SHORT\u STD\u 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加载到dataframe中时,如上面的函数所示,对于一些记录,我得到'None'作为ID和SHORT\u STD\u DESC元素的文本。 但是实际的xml文件有这个值。 所以我不确定为什么它没有反映在我的数据帧中? 任何意见都会对我有很大帮助


Tags: 文件nameidis记录xmlcountrystudent
1条回答
网友
1楼 · 发布于 2024-10-05 11:23:56

这可能是一个评论,而不是一个答案,但我不能把它放在一个实际的评论

尝试改变

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

只是:

 else:             
     doc = self.recursive_dict(elem)    

看看能不能用

相关问题 更多 >

    热门问题