Python解析嵌套XML并展开d

2024-10-01 13:23:58 发布

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

我正在尝试将以下XML数据展平为CSV类型的表数据。在

我可以获取Sal元素及其属性中的数据,但无法将SalC数据展平到父级帆船属性以生成一个平面表数据。在

我想把下面的XML数据展平,这样我就可以写入数据库进行进一步的处理。在

第1列,第2列,第3列,第4列,第5列,第6列,第6列,第7列,第8列,第9列,第10列

XML数据:

<Sal col1="a1" col2="C" col3="12/5/2012" col4="a" col5="8" col6="True">
    <SalC col7="A" col8="1" col9="2" col10="True"/>
    <SalC col7="A1" col8="1" col9="2" col10="False"/>
    <SalC col7="B" col8="1" col9="2" col10="False"/>
    <SalC col7="C" col8="1" col9="2" col10="False"/>
    <SalC col7="D" col8="1" col9="2" col10="False"/>
    <SalC col7="E" col8="1" col9="2" col10="False"/>
    <SalC col7="E1" col8="1" col9="2" col10="False"/>
    <SalC col7="F" col8="1" col9="2" col10="False"/>
</Sal>
<Sal col1="a1" col2="C" col3="12/9/2012" col4="b" col5="8" col6="True">
    <SalC col7="A" col8="1" col9="2" col10="False"/>
    <SalC col7="B" col8="1" col9="2" col10="False"/>
    <SalC col7="C" col8="1" col9="2" col10="True"/>
    <SalC col7="D" col8="1" col9="2" col10="False"/>
    <SalC col7="E" col8="1" col9="2" col10="False"/>
</Sal>
<Sal col1="a2" col2="C" col3="12/8/2012" col4="c" col5="15" col6="True">
    <SalC col7="A" col8="1" col9="2" col10="True"/>
    <SalC col7="A1" col8="1" col9="2" col10="False"/>
    <SalC col7="B" col8="1" col9="2" col10="False"/>
    <SalC col7="C" col8="1" col9="2" col10="True"/>
    <SalC col7="D" col8="1" col9="2" col10="False"/>
    <SalC col7="E" col8="1" col9="2" col10="False"/>
    <SalC col7="E1" col8="1" col9="2" col10="True"/>
    <SalC col7="F" col8="1" col9="2" col10="False"/>
</Sal>
<Sal col1="a3" col2="C" col3="12/9/2012" col4="d" col5="8" col6="True">
    <SalC col7="A" col8="1" col9="2" col10="False"/>
    <SalC col7="B" col8="1" col9="2" col10="False"/>
    <SalC col7="C" col8="1" col9="2" col10="False"/>
    <SalC col7="D" col8="1" col9="2" col10="True"/>
    <SalC col7="E" col8="1" col9="2" col10="False"/>
</Sal>

谢谢你的帮助。在


Tags: 数据falsetruecol2col3col1salcol4
2条回答

使用XSLT可以很容易地解决这一问题,而无需在工作流中引入Python,但是,如果必须使用Python,lxml.etree很方便地引入了一个新的类lxml.etree.XSLT,您可以充分利用它。在

假设您的XML数据位于名为xmlfile.xml的文件中,下面的代码应该可以工作。在

xsltfile.xsl文件

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text" />
        <xsl:template match="SalC">
                <xsl:value-of select="concat(../@col1,',', ../@col2,',',../@col3,',',../@col4,',',../@col5,',',../@col6,',',@col7,',',@col8,',',@col9,',',@col10)" />
        </xsl:template>
</xsl:stylesheet>

示例代码

^{pr2}$

sal.attrib与dict类似:

row = dict(sal.attrib)

salc.attrib也是dict样的。要“扁平化”,或者更确切地说,将两个dict连接在一起,可以使用dict.update

^{pr2}$

假设每个SalC元素都有col7col8cal9col10属性,您可以为sal中的每个salc调用{}:


import lxml.etree as ET
import csv

text = '''\
<root>
<Sal col1="a1" col2="C" col3="12/5/2012" col4="a" col5="8" col6="True">
    <SalC col7="A" col8="1" col9="2" col10="True"/>
...
    <SalC col7="D" col8="1" col9="2" col10="True"/>
    <SalC col7="E" col8="1" col9="2" col10="False"/>
</Sal>
</root>'''

fieldnames = ('col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col6', 'col7', 'col8', 
              'col9', 'col10')

with open('/tmp/output.csv', 'wb') as f:
    writer = csv.DictWriter(f, fieldnames, delimiter = ',', lineterminator = '\n', )
    writer.writeheader()
    root = ET.fromstring(text)
    for sal in root.xpath('//Sal'):
        row = dict(sal.attrib)
        for salc in sal:
            row.update(salc.attrib)
            writer.writerow(row)

收益率

col1,col2,col3,col4,col5,col6,col6,col7,col8,col9,col10
a1,C,12/5/2012,a,8,True,True,A,1,2,True
a1,C,12/5/2012,a,8,True,True,A1,1,2,False
a1,C,12/5/2012,a,8,True,True,B,1,2,False
...
a3,C,12/9/2012,d,8,True,True,B,1,2,False
a3,C,12/9/2012,d,8,True,True,C,1,2,False
a3,C,12/9/2012,d,8,True,True,D,1,2,True
a3,C,12/9/2012,d,8,True,True,E,1,2,False

相关问题 更多 >