📜  如何从嵌套的 XML 创建 Pandas DataFrame?

📅  最后修改于: 2022-05-13 01:55:33.580000             🧑  作者: Mango

如何从嵌套的 XML 创建 Pandas DataFrame?

在本文中,我们将学习如何从嵌套的 XML 创建 Pandas DataFrame。我们将使用xml.etree.ElementTree模块,它是Python的一个内置模块,用于解析或读取 XML 文件中的信息。 ElementTree 将 XML 文档表示为树,而 Element 仅表示树的单个节点。

使用的功能:

在这里,我们将使用一些函数来处理如下代码:

  • ElementTree.parse( XML_file) :从 XML 文件中读取数据
  • root.iter('root_name'):遍历根节点的分支
  • ElementTree.fromstring(XML_file) :在Python代码中作为字符串在三引号内传递的 XML 代码时读取数据
  • prstree.findall('store'):查找解析后的XML ElementTree的所有元素
  • node.attribute.get(attribute_name ):获取属性
  • node.find(attribute_name):检索提到的attribute_name的文本内容
  • pandas.DataFrame() :将 XML 数据转换为 DataFrame
  • list.append() 将项目附加到列表

方法

  • 使用 ElementTree.parse( )函数解析或读取 XML 文件并获取根元素。
  • 遍历根节点以获取子节点属性“SL NO”(此处)并提取每个属性的文本值(此处为 foodItem、价格、数量和折扣)。
  • 获取以规格为单位的各个食品项目附加到列表(此处为 all_items() 列表)。
  • 使用 pandas.DataFrame()函数将列表转换为 DataFrame,并在用逗号分隔的引号内提及列名。
  • 打印 DataFrame 就完成了。

输入嵌套的 XML 数据

XML

  
       
  
           
           Food Store items.
           
  
           
               meat
               200
               1kg
               7%
           
  
           
               fish
               150
               1kg
               5%
           
  
           
               egg
               100
               50 pieces
               5%
           
  
           
               milk
               50
               1 litre
               3%
           
  
       


Python3
import xml.etree.ElementTree as ETree
import pandas as pd
  
# give the path where you saved the xml file
# inside the quotes
xmldata = "C: \\ProgramData\\Microsoft\\
    Windows\\Start Menu\\Programs\\
    Anaconda3(64-bit)\\xmltopandas.xml"
prstree = ETree.parse(xmldata)
root = prstree.getroot()
  
# print(root)
store_items = []
all_items = []
  
for storeno in root.iter('store'):
    
    store_Nr = storeno.attrib.get('slNo')
    itemsF = storeno.find('foodItem').text
    price = storeno.find('price').text
    quan = storeno.find('quantity').text
    dis = storeno.find('discount').text
  
    store_items = [store_Nr, itemsF, price, quan, dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items, columns=[
  'SL No', 'ITEM_NUMBER', 'PRICE', 'QUANTITY', 'DISCOUNT'])
  
print(xmlToDf.to_string(index=False))


Python3
import xml.etree.ElementTree as ETree
import pandas as pd
  
xmldata = '''
        
            
            Food Store items.
            
            
                meat
                200
                1kg
                7%
            
            
                fish
                150
                1kg
                5%
            
            
                egg
                100
                50 pieces
                5%
            
            
                milk
                50
                1 litre
                3%
            
        
'''
  
prstree = ETree.fromstring(xmldata)
root = prstree.tag
  
#print(root)
store_items = []
all_items = []
  
for storeno in prstree.findall('store'):  
    store_Nr = storeno.attrib.get('slNo')
    itemsF= storeno.find('foodItem').text
    price= storeno.find('price').text
    quan= storeno.find('quantity').text
    dis= storeno.find('discount').text
          
    store_items = [store_Nr,itemsF,price,quan,dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items,columns=[
  'SL No','ITEM_NUMBER','PRICE','QUANTITY','DISCOUNT'])        
  
print(xmlToDf.to_string(index=False))


示例 1:

在下面的这段代码中,我们解析了 XML 文件。在引号内提供保存 XML 文件的完整路径。所以这里我们需要使用 ElementTree.parse()函数从 XML 文件中读取数据,然后使用 getroot()函数来获取根。然后按照给出的步骤操作。



蟒蛇3

import xml.etree.ElementTree as ETree
import pandas as pd
  
# give the path where you saved the xml file
# inside the quotes
xmldata = "C: \\ProgramData\\Microsoft\\
    Windows\\Start Menu\\Programs\\
    Anaconda3(64-bit)\\xmltopandas.xml"
prstree = ETree.parse(xmldata)
root = prstree.getroot()
  
# print(root)
store_items = []
all_items = []
  
for storeno in root.iter('store'):
    
    store_Nr = storeno.attrib.get('slNo')
    itemsF = storeno.find('foodItem').text
    price = storeno.find('price').text
    quan = storeno.find('quantity').text
    dis = storeno.find('discount').text
  
    store_items = [store_Nr, itemsF, price, quan, dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items, columns=[
  'SL No', 'ITEM_NUMBER', 'PRICE', 'QUANTITY', 'DISCOUNT'])
  
print(xmlToDf.to_string(index=False))

输出:

注意:XML 文件应保存在保存Python代码的同一目录或文件夹中。

示例 2:

我们还可以将 XML 内容作为三引号内的字符串传递。在这种情况下,我们需要使用 fromstring()函数来读取字符串。使用“标签”对象获取根,并按照上述相同步骤将其转换为 DataFrame。

蟒蛇3

import xml.etree.ElementTree as ETree
import pandas as pd
  
xmldata = '''
        
            
            Food Store items.
            
            
                meat
                200
                1kg
                7%
            
            
                fish
                150
                1kg
                5%
            
            
                egg
                100
                50 pieces
                5%
            
            
                milk
                50
                1 litre
                3%
            
        
'''
  
prstree = ETree.fromstring(xmldata)
root = prstree.tag
  
#print(root)
store_items = []
all_items = []
  
for storeno in prstree.findall('store'):  
    store_Nr = storeno.attrib.get('slNo')
    itemsF= storeno.find('foodItem').text
    price= storeno.find('price').text
    quan= storeno.find('quantity').text
    dis= storeno.find('discount').text
          
    store_items = [store_Nr,itemsF,price,quan,dis]
    all_items.append(store_items)
  
xmlToDf = pd.DataFrame(all_items,columns=[
  'SL No','ITEM_NUMBER','PRICE','QUANTITY','DISCOUNT'])        
  
print(xmlToDf.to_string(index=False))

输出: