Python xml到csv [英] Python xml to csv

查看:534
本文介绍了Python xml到csv的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请先阅读整个问题,然后再标记重复项。

我有一个嵌套的XML文件,我想将其转换为csv文件。
我必须为它写一个python脚本。



XML档案是:

 <?xml version = 1.0?> 
< ListOrdersResponse xmlns =https://mws.amazonservices.com/Orders/2013-09-01>
< ListOrdersResult>
< Orders>
< Order>
< LatestShipDate> 2015-06-02T18:29:59Z< / LatestShipDate>
< OrderType> StandardOrder< / OrderType>
< PurchaseDate> 2015-05-31T03:58:30Z< / PurchaseDate>
< AmazonOrderId> 171-6355256-9594715< / AmazonOrderId>
< LastUpdateDate> 2015-06-01T04:18:58Z< / LastUpdateDate>
< ShipServiceLevel> IN Std Domestic< / ShipServiceLevel>
< NumberOfItemsShipped> 0< / NumberOfItemsShipped>
< OrderStatus>已取消< / OrderStatus>
< SalesChannel> Amazon.in< / SalesChannel>
< NumberOfItemsUnshipped> 0< / NumberOfItemsUnshipped>
< IsPremiumOrder> false< / IsPremiumOrder>
< EarliestShipDate> 2015-05-31T18:30:00Z< / EarliestShipDate>
< MarketplaceId> A21TJRUUN4KGV< / MarketplaceId>
< FulfillmentChannel> MFN< / FulfillmentChannel>
< IsPrime> false< / IsPrime>
< ShipmentServiceLevelCategory>标准< / ShipmentServiceLevelCategory>
< / Order>
< Order>
< LatestShipDate> 2015-06-02T18:29:59Z< / LatestShipDate>
< OrderType> StandardOrder< / OrderType>
< PurchaseDate> 2015-05-31T04:50:07Z< / PurchaseDate>
< BuyerEmail> dr7h1rhy6457rng@marketplace.amazon.in< / BuyerEmail>
< AmazonOrderId> 403-5551715-2566754< / AmazonOrderId>
< LastUpdateDate> 2015-06-01T07:52:49Z< / LastUpdateDate>
< ShipServiceLevel> IN Exp Dom 2< / ShipServiceLevel>
< NumberOfItemsShipped> 2< / NumberOfItemsShipped>
< OrderStatus>已发货< / OrderStatus>
< SalesChannel> Amazon.in< / SalesChannel>
< ShippedByAmazonTFM> false< / ShippedByAmazonTFM>
< LatestDeliveryDate> 2015-06-06T18:29:59Z< / LatestDeliveryDate>
< NumberOfItemsUnshipped> 0< / NumberOfItemsUnshipped>
< BuyerName> Ajit Nair< / BuyerName>
< EarliestDeliveryDate> 2015-06-02T18:30:00Z< / EarliestDeliveryDate>
< OrderTotal>
< CurrencyCode> INR< / CurrencyCode>
< Amount> 938.00< / Amount>
< / OrderTotal>
< IsPremiumOrder> false< / IsPremiumOrder>
< EarliestShipDate> 2015-05-31T18:30:00Z< / EarliestShipDate>
< MarketplaceId> A21TJRUUN4KGV< / MarketplaceId>
< FulfillmentChannel> MFN< / FulfillmentChannel>
< TFMShipmentStatus>已交付< / TFMShipmentStatus>
< PaymentMethod>其他< / PaymentMethod>
< ShippingAddress>
< StateOrRegion> MAHARASHTRA< / StateOrRegion>
< City> THANE< / City>
< Phone> 9769994355< / Phone>
< CountryCode> IN< / CountryCode>
< PostalCode> 400709< / PostalCode>
< Name> Ajit Nair< / Name>
< AddressLine1> C-25 / con-7 / Chandralok CHS< / AddressLine1>
< AddressLine2> Sector-10,Koper khairne< / AddressLine2>
< / ShippingAddress>
< IsPrime> false< / IsPrime>
< ShipmentServiceLevelCategory> Expedited< / ShipmentServiceLevelCategory>
< / Order>

我试图以列表的形式获取代码的值。但它不打印任何东西。



我的代码:

  from xml.etree import ElementTree 

with open('orders.xml','rb')as f:
tree = ElementTree.parse(f)

对于tree.findall('.// Order')中的节点:$ b​​ $ b oid = node.attrib.get('SellerOrderId')
如果oid:
print oid

我的代码有什么问题?



完成文件 Orders.xml

解决方案

您的XML具有默认命名空间

 < ListOrdersResponse xmlns = https://mws.amazonservices.com/Orders/2013-09-01\">除非另有说明,否则后代元素继承祖先默认命名空间隐含   您需要结合命名空间+本地名称来形成完全限定的元素名称,例如:

  ns = {'d': 'https://mws.amazonservices.com/Orders/2013-09-01'} 
for tree.findall('.// d:Order',ns):
oid = node .attrib.get('SellerOrderId')
如果oid:
print oid

根据您链接到的完整XML文件, SellerOrderId Order 的子元素,而不是属性。在这种情况下,您可以使用。d:Order / d:SellerOrderId 来获取它们,然后打印它的值,例如:

  ns = {'d':'https://mws.amazonservices.com/Orders/2013-09-01'} 
for node在tree.findall('.// d:Order / d:SellerOrderId',ns):
print node.text

输出:

  171-1322776-9700344 
171-4214129-7148305
402-8263846-7042737
402-7017923-9474716
402-9691237-2887553
171-4614227-7597903
403-6729903-2119563
402-2184564-2676353
171-4520392-2088330
402-7986969-8827533


Please read entire question before marking duplicate.
I have a nested XML file which i Want to convert to a csv file. I have to write a python script for same.

The XML file is:

<?xml version="1.0"?>
<ListOrdersResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">
  <ListOrdersResult>
    <Orders>
      <Order>
        <LatestShipDate>2015-06-02T18:29:59Z</LatestShipDate>
        <OrderType>StandardOrder</OrderType>
        <PurchaseDate>2015-05-31T03:58:30Z</PurchaseDate>
        <AmazonOrderId>171-6355256-9594715</AmazonOrderId>
        <LastUpdateDate>2015-06-01T04:18:58Z</LastUpdateDate>
        <ShipServiceLevel>IN Std Domestic</ShipServiceLevel>
        <NumberOfItemsShipped>0</NumberOfItemsShipped>
        <OrderStatus>Canceled</OrderStatus>
        <SalesChannel>Amazon.in</SalesChannel>
        <NumberOfItemsUnshipped>0</NumberOfItemsUnshipped>
        <IsPremiumOrder>false</IsPremiumOrder>
        <EarliestShipDate>2015-05-31T18:30:00Z</EarliestShipDate>
        <MarketplaceId>A21TJRUUN4KGV</MarketplaceId>
        <FulfillmentChannel>MFN</FulfillmentChannel>
        <IsPrime>false</IsPrime>
        <ShipmentServiceLevelCategory>Standard</ShipmentServiceLevelCategory>
    </Order>
    <Order>   
        <LatestShipDate>2015-06-02T18:29:59Z</LatestShipDate>
        <OrderType>StandardOrder</OrderType>
        <PurchaseDate>2015-05-31T04:50:07Z</PurchaseDate>
        <BuyerEmail>dr7h1rhy6457rng@marketplace.amazon.in</BuyerEmail>
        <AmazonOrderId>403-5551715-2566754</AmazonOrderId>
        <LastUpdateDate>2015-06-01T07:52:49Z</LastUpdateDate>
        <ShipServiceLevel>IN Exp Dom 2</ShipServiceLevel>
        <NumberOfItemsShipped>2</NumberOfItemsShipped>
        <OrderStatus>Shipped</OrderStatus>
        <SalesChannel>Amazon.in</SalesChannel>
        <ShippedByAmazonTFM>false</ShippedByAmazonTFM>
        <LatestDeliveryDate>2015-06-06T18:29:59Z</LatestDeliveryDate>
        <NumberOfItemsUnshipped>0</NumberOfItemsUnshipped>
        <BuyerName>Ajit Nair</BuyerName>
        <EarliestDeliveryDate>2015-06-02T18:30:00Z</EarliestDeliveryDate>
        <OrderTotal>
          <CurrencyCode>INR</CurrencyCode>
          <Amount>938.00</Amount>
        </OrderTotal>
        <IsPremiumOrder>false</IsPremiumOrder>
        <EarliestShipDate>2015-05-31T18:30:00Z</EarliestShipDate>
        <MarketplaceId>A21TJRUUN4KGV</MarketplaceId>
        <FulfillmentChannel>MFN</FulfillmentChannel>
        <TFMShipmentStatus>Delivered</TFMShipmentStatus>
        <PaymentMethod>Other</PaymentMethod>
        <ShippingAddress>
          <StateOrRegion>MAHARASHTRA</StateOrRegion>
          <City>THANE</City>
          <Phone>9769994355</Phone>
          <CountryCode>IN</CountryCode>
          <PostalCode>400709</PostalCode>
          <Name>Ajit Nair</Name>
          <AddressLine1>C-25 / con-7 / Chandralok CHS</AddressLine1>
          <AddressLine2>Sector-10 ,Koper khairne</AddressLine2>
        </ShippingAddress>
        <IsPrime>false</IsPrime>
        <ShipmentServiceLevelCategory>Expedited</ShipmentServiceLevelCategory>
      </Order>

I tried to get values for my code in form of a list. But it doesn't print anything.

My Code:

from xml.etree import ElementTree

with open('orders.xml', 'rb') as f:
tree = ElementTree.parse(f)

for node in tree.findall('.//Order'):
    oid = node.attrib.get('SellerOrderId')
    if oid:
        print oid

What is wrong with my code?

EDIT: Temporary link to complete File Orders.xml

解决方案

Your XML has default namespace defined here :

<ListOrdersResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">

Note that descendant elements inherits ancestor default namespace implicitly, unless otherwise specified. You need to combine namespace + local name to form a fully qualified element name, for example :

ns = {'d': 'https://mws.amazonservices.com/Orders/2013-09-01'}     
for node in tree.findall('.//d:Order', ns):
    oid = node.attrib.get('SellerOrderId')
    if oid:
        print oid

According to the full XML file you linked to, SellerOrderId is child element of Order instead of attribute. In this case, you can simply use .//d:Order/d:SellerOrderId to get them and then print it's value, like so :

ns = {'d': 'https://mws.amazonservices.com/Orders/2013-09-01'}  
for node in tree.findall('.//d:Order/d:SellerOrderId', ns):
    print node.text

output :

171-1322776-9700344
171-4214129-7148305
402-8263846-7042737
402-7017923-9474716
402-9691237-2887553
171-4614227-7597903
403-6729903-2119563
402-2184564-2676353
171-4520392-2088330
402-7986969-8827533

这篇关于Python xml到csv的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆