【发布时间】:2021-11-04 22:24:52
【问题描述】:
我有一个很大的 XML 文件。我在下面包含了一个擦洗过的 sn-p。下面的result-size是文件调用<row>的XML文件中的元素个数。
问题 1:如何只能在输出 CSV 文件中获取类型为 <COLLECTION-ITEM> 的每个 <row> 的记录,而不是所有其他类型的记录?我无法控制 XML 的结构。如果您在我的 Python 代码中注释掉除测试值之外的所有值,您会看到该文件输出 5 条记录,而我只需要 1 条记录。
问题 2:我需要在 Python 中做些什么不同的事情才能让 name = i.find("name").text 返回“项目 1 的名称”?
我认为只关注前两个问题的答案是公平的。我希望得到这些答案能让我走上解决这个 XML 到 CSV 问题的其余问题的道路。不过,这是大局和我需要解决的更多问题。给我指点书籍、课程,任何有帮助的东西。我只有一周左右的时间来完成这项工作。
期望的输出:
Collection item,ITEM-ID,ATTRIB-1,PERSON-TYPE-1-NAME,ATTRIB-2,PERSON-TYPE-2-NAME,RELATED-THING-1 id,RELATED-THING-2 IDs
name of Item 1,item_000001,Yes,name of person 1,Yes,name of person 2,thing_000745,"thing_000783, thing_000803"
我可以读取文件并输出带有我指定的列名的 CSV 文件。但我什至无法将第一件事的名称输入 CSV。
还有一些更复杂的位需要函数,例如根据匹配类型和名称属性找到一个 ID 属性,并返回多个 ID。请参阅 RELATED-THING-1-ID 和 RELATED-THING-2-ID。
这是我的 Python(基于 https://www.geeksforgeeks.org/convert-xml-to-csv-in-python/):
# -*- coding: utf-8 -*-
# Importing the required libraries
import xml.etree.ElementTree as Xet
import pandas as pd
cols = ["Collection item", "ITEM-ID", "ATTRIB-1", "PERSON-TYPE-1-NAME" ,
"ATTRIB-2", "PERSON-TYPE-2-NAME", "RELATED-THING-1 id",
"RELATED-THING-2 IDs"]
rows = []
# Parsing the XML file
xmlparse = Xet.parse('sample.xml')
root = xmlparse.getroot()
for i in root:
name = i.find("name").text
item_id = i.find("ITEM-ID").text
attrib_1 = i.find("ATTRIB-1").text
p1_name = i.find("PERSON-TYPE-1-NAME.result.row.name").text
attrib_2 = i.find("ATTRIB-2").text
p2_name = i.find("PERSON-TYPE-2-NAME.result.row.name").text
relat_thing1_id = i.find("country").text
relat_thing2_ids = i.find("country").text
rows.append({"Collection item": name,
"ITEM-ID": item_id,
"ATTRIB-1": attrib_1,
"PERSON-TYPE-1-NAME": p1_name,
"ATTRIB-2": attrib_2,
"PERSON-TYPE-2-NAME": p2_name,
"RELATED-THING-1 id": relat_thing1_id,
"RELATED-THING-2 IDs": relat_thing2_ids
})
df = pd.DataFrame(rows, columns=cols)
# Writing dataframe to csv
df.to_csv('output.csv')
这是 XML:
<?xml version="1.0" encoding="UTF-8"?>
<result size="4321">
<row>
<id>3255183</id>
<type>CONTEXT</type>
<name>collections</name>
</row>
<row>
<id>3652889</id>
<type>COLLECTION-ITEM</type>
<name>name of Item 1</name>
<ITEM-ID>item_000001</ITEM-ID>
<ATTRIB-1>Yes</ATTRIB-1>
<PERSON-TYPE-1-NAME>
<result size="1">
<row>
<id>3254728</id>
<scopeId>3254388</scopeId>
<type>PERSON</type>
<name>name of person 1</name>
<no>1</no>
</row>
</result>
</PERSON-TYPE-1-NAME>
<ATTRIB-2>Yes</ATTRIB-2>
<PERSON-TYPE-2-NAME>
<result size="1">
<row>
<id>3254403</id>
<scopeId>3254388</scopeId>
<type>PERSON</type>
<name>name of person 2</name>
<no>1</no>
</row>
</result>
</PERSON-TYPE-2-NAME>
<RELATED-THING-1>
<result size="1">
<row>
<id>3391122</id>
<scopeId>3255191</scopeId>
<type>THING-TYPE-1</type>
<name>thing type 1 name 1</name>
<no>1</no>
</row>
</result>
</RELATED-THING-1>
<RELATED-THING-2>
<result size="2">
<row>
<id>3255215</id>
<scopeId>3255198</scopeId>
<type>THING-TYPE-2</type>
<name>thing type 2 name 1</name>
<no>1</no>
</row>
<row>
<id>3255227</id>
<scopeId>3255198</scopeId>
<type>THING-TYPE-2</type>
<name>thing type 2 name 2</name>
<no>1</no>
</row>
</result>
</RELATED-THING-2>
</row>
<row>
<id>3391122</id>
<type>THING-TYPE-1</type>
<name>thing type 1 name 1</name>
<THING-ID>thing_000745</THING-ID>
</row>
<row>
<id>3255215</id>
<type>THING-TYPE-2</type>
<name>thing type 2 name 1</name>
<THING-ID>thing_000783</THING-ID>
</row>
<row>
<id>3255227</id>
<type>THING-TYPE-2</type>
<name>thing type 2 name 2</name>
<THING-ID>thing_000803</THING-ID>
</row>
</result>
【问题讨论】:
标签: python csv xml-parsing