Python 使用路径和值从xml文件创建数据帧

Python 使用路径和值从xml文件创建数据帧,python,xml,dataframe,loops,lxml,Python,Xml,Dataframe,Loops,Lxml,这是xml文件中的数据 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header /> <SOAP-ENV:Body> <ADD_LandIndex_001> <CNTROLAREA> <BSR> <st

这是xml文件中的数据

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <ADD_LandIndex_001>
      <CNTROLAREA>
        <BSR>
          <status>ADD</status>
          <NOUN>LandIndex</NOUN>
          <REVISION>001</REVISION>
        </BSR>
      </CNTROLAREA>
      <DATAAREA>
        <LandIndex>
          <reportId>AMI100031</reportId>
          <requestKey>R3278458</requestKey>
          <SubmittedBy>EN4871</SubmittedBy>
          <submittedOn>2015/01/06 4:20:11 PM</submittedOn>
          <LandIndex>
            <agreementdetail>
              <agreementid>001       4860</agreementid>
              <agreementtype>NATURAL GAS</agreementtype>
              <currentstatus>
                <status>ACTIVE</status>
                <statuseffectivedate>1965/02/18</statuseffectivedate>
                <termdate>1965/02/18</termdate>
              </currentstatus>
              <designatedrepresentative></designatedrepresentative>
            </agreementdetail>
          </LandIndex>
        </LandIndex>
      </DATAAREA>
    </ADD_LandIndex_001>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope
我有一个不起作用的小代码!它返回一个空的数据帧,但是我可以通过函数循环中的
print(d)
看到它正确地获取了每个元素。我真的不知道怎么了?任何人都能找到为什么它是空的,不能工作

from lxml import etree as et
from collections import defaultdict
import pandas as pd
import os


filename = 'file_try.xml' 
namespace = '{http://schemas.xmlsoap.org/soap/envelope/}'

with open(filename, 'rb') as file: 
    root = et.parse(file).getroot()
    
tree = et.ElementTree(root) 

col_name = ['Path', 'Value']
dataF = pd.DataFrame([],columns = col_name)

def traverse(el,d):
    
    if len(list(el)) > 0:
        for child in el:
            traverse(child,d)

    else:

        if el.text is not None:
            d = d.append({'Path': tree.getelementpath(el).replace(namespace,''), 'Value' : el.text }, ignore_index = True)
            print(d)
            
    return d

df = traverse(root,dataF)
print(df)

df.to_excel("data_2.xlsx") 
试试这个

from simplified_scrapy import SimplifiedDoc, utils
rows = []
rows.append(['Path', 'Value'])
xml = utils.getFileContent('file_try.xml')
doc = SimplifiedDoc(xml)
body = doc.select('SOAP-ENV:Body')

def getPathValue(node, path):
    path = path + '/' + node['tag'] # Splicing path
    children = node.children
    if children:
        traverseNodes(children, path)
    else:
        rows.append([path, node.text])

def traverseNodes(nodes, path):
    for node in nodes:  # Traversing child nodes
        getPathValue(node, path)

traverseNodes(body.children, "Body")

# print(rows)
utils.save2csv('data_2.csv', rows)
结果:

[['Body/ADD_LandIndex_001/CNTROLAREA/BSR/status', 'ADD'], ['Body/ADD_LandIndex_001/CNTROLAREA/BSR/NOUN', 'LandIndex'], ['Body/ADD_LandIndex_001/CNTROLAREA/BSR/REVISION', '001'], ['Body/ADD_LandIndex_001/DATAAREA/LandIndex/reportId', 'AMI100031'], ['Body/ADD_LandIndex_001/DATAAREA/LandIndex/requestKey', 'R3278458'], 
...

通过查看@yazz的答案,我发现了我的错误

代码如下:

from lxml import etree as et
import pandas as pd
import os


filename = 'file_try.xml' 
namespace = '{http://schemas.xmlsoap.org/soap/envelope/}'

with open(filename, 'rb') as file: 
    root = et.parse(file).getroot()
    
tree = et.ElementTree(root) 

col_name = ['Path', 'Value']
data = []

def traverse(el,d):
    
    if len(list(el)) > 0:
        for child in el:
            traverse(child,d)

    else:

        if el.text is not None:
            d.append([(tree.getelementpath(el)+str(el.xpath('@Ccy'))).replace(namespace,''), el.text])
            print(d)
            
    return d

df = pd.DataFrame(traverse(root,data), columns = col_name)

df.to_excel("data_2.xlsx") 
from lxml import etree as et
import pandas as pd
import os


filename = 'file_try.xml' 
namespace = '{http://schemas.xmlsoap.org/soap/envelope/}'

with open(filename, 'rb') as file: 
    root = et.parse(file).getroot()
    
tree = et.ElementTree(root) 

col_name = ['Path', 'Value']
data = []

def traverse(el,d):
    
    if len(list(el)) > 0:
        for child in el:
            traverse(child,d)

    else:

        if el.text is not None:
            d.append([(tree.getelementpath(el)+str(el.xpath('@Ccy'))).replace(namespace,''), el.text])
            print(d)
            
    return d

df = pd.DataFrame(traverse(root,data), columns = col_name)

df.to_excel("data_2.xlsx")