【问题标题】:How to convert xml data into a csv file?如何将xml数据转换成csv文件?
【发布时间】:2021-05-04 12:33:36
【问题描述】:

我有以下 xml 格式的数据。现在,我需要将标题“Expression Field 1”、“X Gender”、“Entrant Age”等中的数据提取到 csv 文件中。我已经编写了以下代码,但它不起作用。请帮忙。当我尝试以下代码时,我收到错误“'NoneType' object has no attribute 'tag''”

import xml.etree.ElementTree as Xet
import pandas as pd

cols = ["EXPRESSION_FIELD_1", "XGENDER", "ENTRANT-AGE", "CATEGORY2-NUM__SNZ", "XCATEGORY1", "RESULT-TIME-MILLISECONDS","FINA-POINTS__SNZ"]
rows = []

# Parsing the XML file
xmlparse = Xet.parse('sample.xml')
root = xmlparse.getroot()

for i in root:
    name = i.find("EXPRESSION_FIELD_1").tag
    gender = i.find("XGENDER").tag
    age = i.find("ENTRANT-AGE").tag
    category = i.find("CATEGORY2-NUM__SNZ").tag
    result = i.find("XCATEGORY1").tag
  
    rows.append({"name": name,
                 "gender": gender,
                 "age": age,
                 "category": category,
                 "result": result})
  
df = pd.DataFrame(rows, columns=cols)
  
# Writing dataframe to csv
df.to_csv('output.csv')

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TableData>
    <Fields>
        <Field align="" field="FRAGMENT_DISPLAY.SPLITS" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Expander" name="FRAGMENT_DISPLAY-SPLITS" showInExpander="true" sortable="true" source="tableColumn" type="string" width=""/>
        <Field align="" field="EXPRESSION_FIELD_1" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Name " name="EXPRESSION_FIELD_1" showInExpander="false" sortable="false" source="tableColumn" type="string" width="130"/>
        <Field align="" field="XGENDER" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Gender" name="XGENDER" showInExpander="false" sortable="true" source="tableColumn" type="string" width="50"/>
        <Field align="" field="ENTRANT.AGE" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Age" name="ENTRANT-AGE" showInExpander="false" sortable="true" source="tableColumn" type="int" width="35"/>
        <Field align="" field="CATEGORY2.NUM$$SNZ" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Distance" name="CATEGORY2-NUM__SNZ" showInExpander="false" sortable="true" source="tableColumn" type="int" width="70"/>
        <Field align="" field="XCATEGORY1" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Stroke" name="XCATEGORY1" showInExpander="false" sortable="true" source="tableColumn" type="string" width="70"/>
        <Field align="right" field="RESULT.TIME.MILLISECONDS" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Time " name="RESULT-TIME-MILLISECONDS" showInExpander="false" sortable="true" source="tableColumn" type="int" width="70"/>
        <Field align="right" field="FINA.POINTS$$SNZ" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="FINA Points" name="FINA-POINTS__SNZ" showInExpander="false" sortable="true" source="tableColumn" type="string" width="85"/>
        <Field align="right" field="FINA.YEAR$$SNZ" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Points Year" name="FINA-YEAR__SNZ" showInExpander="false" sortable="true" source="tableColumn" type="string" width="80"/>
        <Field align="right" field="$DATE$COMP.DATE" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Date" name="_DATE_COMP-DATE" showInExpander="false" sortable="true" source="tableColumn" type="string" width="70"/>
        <Field align="" field="XEVENT.CODE" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Meet" name="XEVENT-CODE" showInExpander="false" sortable="true" source="tableColumn" type="string" width="190"/>
        <Field align="" field="PARAMETER1" hasEmailLink="false" hasHyperlink="false" hidden="false" id="" label="Course" name="PARAMETER1" showInExpander="false" sortable="true" source="tableColumn" type="string" width="50"/>
        <Field field="MEMBER.FORE1" name="MEMBER-FORE1" type="string"/>
        <Field field="MEMBER.SURNAME" name="MEMBER-SURNAME" type="string"/>
        <Field field="XCATEGORY2" name="XCATEGORY2" type="string"/>
        <Field field="TIME$$SNZ" name="TIME__SNZ" type="string"/>
    </Fields>
    <TotalRows>77910</TotalRows>
    <StartRowIndex>21</StartRowIndex>
    <EndRowIndex>41</EndRowIndex>
    <RowCount>20</RowCount>
    <Rows>
        <Row>
            <MEMBER-FORE1>Ieuan</MEMBER-FORE1>
            <MEMBER-SURNAME>Edwards</MEMBER-SURNAME>
            <XCATEGORY2>100 metre</XCATEGORY2>
            <TIME__SNZ>1:30.23</TIME__SNZ>
            <FRAGMENT_DISPLAY-SPLITS type="string">&lt;!-- Start Fragment DISPLAY.SPLITS--&gt;&lt;!-- Time Taken 16 Milliseconds--&gt;&lt;apt_fragment_ms.comp.results_display.splits&gt;&lt;div class="test-message" style="display:none"&gt;Public&lt;/div&gt;&lt;!-- Start Display Process B:MS.CMS.BUILD.COMP.RESULTS.SPLITS,PUBLISHED,6--&gt;&lt;!-- Time Taken 0 Milliseconds--&gt;&lt;table border="1" &gt;&lt;tr&gt;&lt;td&gt;Split Distance&lt;/td&gt;&lt;td style="width:50px" align="right"&gt;50&lt;/td&gt;&lt;td style="width:50px" align="right"&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cumulative&lt;/td&gt;&lt;td  align="right"&gt;42.53&lt;/td&gt;&lt;td  align="right"&gt;1:30.23&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Individual&lt;/td&gt;&lt;td  align="right"&gt;42.53&lt;/td&gt;&lt;td  align="right"&gt;47.70&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;!-- End Display Process B:MS.CMS.BUILD.COMP.RESULTS.SPLITS,PUBLISHED,6--&gt;&lt;div class="test-message" style="display:none"&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Staff Site&lt;/label&gt;&lt;span class="output"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Key&lt;/label&gt;&lt;span class="output"&gt;004837*I*1319&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Stage&lt;/label&gt;&lt;span class="output"&gt;P&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Heat&lt;/label&gt;&lt;span class="output"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;style&gt;&#13;/*&lt;![CDATA[*/.fields table {border:0 none;}.splits td {background-color:pink;}/*]]&gt;*/&#13;&lt;/style&gt;&lt;/apt_fragment_ms.comp.results_display.splits&gt;&lt;!-- End Fragment DISPLAY.SPLITS--&gt;</FRAGMENT_DISPLAY-SPLITS>
            <EXPRESSION_FIELD_1>Ieuan Edwards</EXPRESSION_FIELD_1>
            <XGENDER type="string">Male</XGENDER>
            <ENTRANT-AGE type="int">18</ENTRANT-AGE>
            <CATEGORY2-NUM__SNZ type="int">100 metre</CATEGORY2-NUM__SNZ>
            <XCATEGORY1 type="string">Breaststroke</XCATEGORY1>
            <RESULT-TIME-MILLISECONDS type="int">1:30.23</RESULT-TIME-MILLISECONDS>
            <FINA-POINTS__SNZ type="string">250</FINA-POINTS__SNZ>
            <FINA-YEAR__SNZ type="string">2021</FINA-YEAR__SNZ>
            <_DATE_COMP-DATE type="string">10/04/2021</_DATE_COMP-DATE>
            <XEVENT-CODE type="string">2021 Aon New Zealand Swimming Championships</XEVENT-CODE>
            <PARAMETER1 type="string">L</PARAMETER1>
        </Row>
        <Row>
            <MEMBER-FORE1>Sophie</MEMBER-FORE1>
            <MEMBER-SURNAME>Irving</MEMBER-SURNAME>
            <XCATEGORY2>50 metre</XCATEGORY2>
            <TIME__SNZ>29.73</TIME__SNZ>
            <FRAGMENT_DISPLAY-SPLITS type="string">&lt;!-- Start Fragment DISPLAY.SPLITS--&gt;&lt;!-- Time Taken 16 Milliseconds--&gt;&lt;apt_fragment_ms.comp.results_display.splits&gt;&lt;div class="test-message" style="display:none"&gt;Public&lt;/div&gt;&lt;!-- Start Display Process B:MS.CMS.BUILD.COMP.RESULTS.SPLITS,PUBLISHED,6--&gt;&lt;!-- Time Taken 0 Milliseconds--&gt;&lt;table border="1" &gt;&lt;tr&gt;&lt;td&gt;Split Distance&lt;/td&gt;&lt;td style="width:50px" align="right"&gt;50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cumulative&lt;/td&gt;&lt;td  align="right"&gt;29.73&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Individual&lt;/td&gt;&lt;td  align="right"&gt;29.73&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;!-- End Display Process B:MS.CMS.BUILD.COMP.RESULTS.SPLITS,PUBLISHED,6--&gt;&lt;div class="test-message" style="display:none"&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Staff Site&lt;/label&gt;&lt;span class="output"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Key&lt;/label&gt;&lt;span class="output"&gt;004837*I*131&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Stage&lt;/label&gt;&lt;span class="output"&gt;P&lt;/span&gt;&lt;/div&gt;&lt;div class="apt-form-item"&gt;&lt;label&gt;Heat&lt;/label&gt;&lt;span class="output"&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;style&gt;&#13;/*&lt;![CDATA[*/.fields table {border:0 none;}.splits td {background-color:pink;}/*]]&gt;*/&#13;&lt;/style&gt;&lt;/apt_fragment_ms.comp.results_display.splits&gt;&lt;!-- End Fragment DISPLAY.SPLITS--&gt;</FRAGMENT_DISPLAY-SPLITS>
            <EXPRESSION_FIELD_1>Sophie Irving</EXPRESSION_FIELD_1>
            <XGENDER type="string">Female</XGENDER>
            <ENTRANT-AGE type="int">18</ENTRANT-AGE>
            <CATEGORY2-NUM__SNZ type="int">50 metre</CATEGORY2-NUM__SNZ>
            <XCATEGORY1 type="string">Butterfly</XCATEGORY1>
            <RESULT-TIME-MILLISECONDS type="int">29.73</RESULT-TIME-MILLISECONDS>
            <FINA-POINTS__SNZ type="string">554</FINA-POINTS__SNZ>
            <FINA-YEAR__SNZ type="string">2021</FINA-YEAR__SNZ>
            <_DATE_COMP-DATE type="string">10/04/2021</_DATE_COMP-DATE>
            <XEVENT-CODE type="string">2021 Aon New Zealand Swimming Championships</XEVENT-CODE>
            <PARAMETER1 type="string">L</PARAMETER1>
        </Row>

【问题讨论】:

    标签: xml csv


    【解决方案1】:

    你快到了。而且,顺便说一句,要写入 csv,您实际上并不需要通过 pandas:

    data = []
    rows = root.findall('.//Row')
    for i in rows:   
        name = i.find(".//EXPRESSION_FIELD_1").text
        gender = i.find(".//XGENDER").text
        age = i.find(".//ENTRANT-AGE").text
        category = i.find(".//CATEGORY2-NUM__SNZ").text
        result = i.find(".//XCATEGORY1").text
        data.append([name,gender,age,category,result])
    
    cols = ["EXPRESSION_FIELD_1", "XGENDER", "ENTRANT-AGE", "CATEGORY2-NUM__SNZ", "XCATEGORY1"]
    
    #now just write to csv
    with open('output.csv', 'w', encoding='UTF8', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(cols)
        writer.writerows(data)
    

    【讨论】:

    • 非常感谢,杰克。当我使用此代码时,我得到一个只有标题的空白 csv 文件。杰克,可能是什么原因?
    • @SanjayFuloria 我不知道原因 - 答案基于您问题中的 xml;该 xml 必须修复(格式不正确),它可能不代表您正在使用的 sample.xml 中的实际 xml。如果您尝试先加载到 pandas 然后保存到 csv,看看是否会得到不同的结果。您必须自己摸索,并根据实际文件找到答案。
    • 好的,杰克。谢谢。即使使用熊猫,我也得到了相同的结果。 xml 的格式可能是个问题。我会检查的。
    • 非常感谢@JackFleeting。有效。我使用 BBEdit 保存 xml,然后使用该文件,您的代码运行良好。非常感谢。
    【解决方案2】:

    这是在@JackFleeting 的帮助下的最终代码。我先用BBEdit保存了xml文件,然后用了。 MS Word 不适用于此。

    #Importing the required libraries
    import xml.etree.ElementTree as ET
    import csv
    
    #Parsing the xml file
    tree = ET.parse("sample.xml")
    root = tree.getroot()
    
    #Creating an array and looping through the document to find headers
    data = []
    rows = root.findall('.//Row')
    for i in rows:   
        name = i.find(".//EXPRESSION_FIELD_1").text
        gender = i.find(".//XGENDER").text
        age = i.find(".//ENTRANT-AGE").text
        category = i.find(".//CATEGORY2-NUM__SNZ").text
        result = i.find(".//XCATEGORY1").text
        data.append([name,gender,age,category,result])
    
    #Creating columns
        cols = ["EXPRESSION_FIELD_1", "XGENDER", "ENTRANT-AGE", "CATEGORY2-NUM__SNZ", "XCATEGORY1"]
    
    #now just write to csv
    with open('output.csv', 'w', encoding='UTF8', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(cols)
        writer.writerows(data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2015-10-28
      • 2014-11-22
      • 2017-04-18
      • 1970-01-01
      • 2020-01-27
      • 2020-07-01
      相关资源
      最近更新 更多