我有许多以下格式的XML对象:
<GetSingleItemResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Timestamp>2012-10-25T03:09:50.817Z</Timestamp>
<Ack>Success</Ack>
<Build>E795_CORE_BUNDLED_15430047_R1</Build>
<Version>795</Version>
<Item>
<Description>...</Description>
<ItemID>330810813385</ItemID>
<EndTime>2012-10-25T04:32:37.000Z</EndTime>
<Location>Paypal Prefered</Location>
<GalleryURL>...</GalleryURL>
<PictureURL>...</PictureURL>
<PictureURL>...</PictureURL>
<PrimaryCategoryID>177</PrimaryCategoryID>
<PrimaryCategoryName>
Computers/Tablets & Networking:Laptops & Netbooks:PC Laptops & Netbooks
</PrimaryCategoryName>
<BidCount>2</BidCount>
<ConvertedCurrentPrice currencyID="USD">294.99</ConvertedCurrentPrice>
<ListingStatus>Active</ListingStatus>
<TimeLeft>PT1H22M47S</TimeLeft>
<Title>
HP Compaq ZD8000 3800Mhz Full Loaded Ready to go, nice unit & super fast Laptop
</Title>
<ShippingCostSummary>
<ShippingServiceCost currencyID="USD">23.99</ShippingServiceCost>
<ShippingType>Flat</ShippingType>
<ListedShippingServiceCost currencyID="USD">23.99</ListedShippingServiceCost>
</ShippingCostSummary>
<ItemSpecifics>
<NameValueList>
<Name>Operating System</Name>
<Value>Windows XP Professional</Value>
</NameValueList>
<NameValueList>
<Name>Screen Size</Name>
<Value>17.0</Value>
</NameValueList>
<NameValueList>
<Name>Processor Type</Name>
<Value>Intel Pentium 4 HT</Value>
</NameValueList>
</ItemSpecifics>
<Country>US</Country>
<AutoPay>false</AutoPay>
<ConditionID>2500</ConditionID>
<ConditionDisplayName>Seller refurbished</ConditionDisplayName>
</Item>
</GetSingleItemResponse>
对于每个xml对象,我想获取所有项目标记标记,例如itemid,endtime等。以及所有项目细节标记标记,例如操作系统,屏幕大小等。我想喜欢将每个xml对象保存到内存中,并将其保存到适当的数据结构(对象)中。最后,我想将所有xml对象的所有信息写入csv文件。
难点在于先验我不知道csv文件的列(标题)是什么。对于第一个xml对象,我将创建与项目和项目细节组合的子标记数量一样多的列。
然后,当新列显示新列时,我会添加越来越多的列,为以前没有出现的列添加NA。
我正在寻找有关如何处理xml对象的建议,要转换(保存)xml对象的数据结构,以及如何将所有最终处理的xml数据写入csv文件。
感谢。
答案 0 :(得分:2)
对于csv中的每一行,您应该创建一个字典。在解析xml时,您应该从代码段中为每个<Item>
填充此字典。当你这样做时,你应该保留一组键,即列......在文件末尾,你会知道你有多少列及其标题。
以下是一个如何完成此操作的小片段(如果数据适合内存),我将使用BeautifulSoup,因为您在标签中提到它并且它很棒:
import sys
import csv
from BeautifulSoup import BeautifulSoup as Soup
doc = Soup(xml_string)
data = []
cols = set()
for item in doc.findAll('item'):
d = {}
for sub in item:
if hasattr(sub, 'name'):
d[sub.name] = sub.text
data.append(d)
cols = cols.union(d.keys())
cw = csv.writer(sys.stdout)
cw.writerow(cols)
for row in data:
cw.writerow([row.get(k, 'N/A') for k in cols])
请注意,此解决方案假设您的密钥是唯一的,但在您的示例中,该项目有两个图片网址,如果您希望两者都显示它是可能的(因为没有什么是不可能的)只是稍微复杂一点。
如果数据不适合内存,则需要执行两次传递,第一次传递以收集键,第二次传递以打印csv ...注意,您应该将BeautifulSoup替换为另一种解析器,如{{ 3}}在这种情况下,因为数据不适合内存