如何使用 python 将此 XML 文件转换为 CSV?

How to convert this XML file to CSV using python?

特此附上我要转换为 csv 的 xml 文件

<?xml version="1.0"?>
<response>
  <data>
    <shops>
      <shop id="204019">
        <name>Bannockburn</name>
        <status>Open</status>
        <company id="25">Franchise</company>
        <shopAttributes>
          <shopAttribute attrName="shop_OPEN_DATE">2008-07-16</shopAttribute>
          <shopAttribute attrName="CLOSE_DATE"/>
          <shopAttribute attrName="shop_DISTRIBUTION_CTR_GENERAL" startDate="2019-03-19">90</shopAttribute>
          <shopAttribute attrName="shop_DISTRIBUTION_CTR_GENERAL" startDate="1900-01-01" endDate="2019-03-18"/>
        </shopAttributes>
        <addresses>
          <address type="PUBLIC">
            <addressLine1>1211 Half Day Road</addressLine1>
            <addressLine2></addressLine2>
            <city>Bannockburn</city>
            <stateProvince>IL</stateProvince>
            <postalCode>60015</postalCode>
            <country>USA</country>
            <latitude>42.199461</latitude>
            <longitude>-87.860582</longitude>
          </address>
        </addresses>
      </shop>
      <shop id="204020">
        <name>Plainfield - North Plainfield</name>
        <status>Open</status>
        <company id="25">Franchise</company>
        <shopAttributes>
          <shopAttribute attrName="shop_OPEN_DATE">2007-05-18</shopAttribute>
          <shopAttribute attrName="CLOSE_DATE"/>
          <shopAttribute attrName="shop_DISTRIBUTION_CTR_GENERAL" startDate="2019-03-19">90</shopAttribute>
          <shopAttribute attrName="shop_DISTRIBUTION_CTR_GENERAL" startDate="1900-01-01" endDate="2019-03-18"/>
        </shopAttributes>
        <addresses>
          <address type="PUBLIC">
            <addressLine1>12632 IL Route 59</addressLine1>
            <addressLine2>Suite #102</addressLine2>
            <city>Plainfield</city>
            <stateProvince>IL</stateProvince>
            <postalCode>60585</postalCode>
            <country>USA</country>
            <latitude>41.653125</latitude>
            <longitude>-88.204527</longitude>
          </address>
        </addresses>
      </shop>
</shops>
</data>
</response>

这是我要转换为 csv 的 xml 文件,有人可以帮助我如何在 python 中转换吗? 下面是我尝试使用的代码,但我还没有真正理解如何去做,看了一些例子,但不是很清楚

from xml.etree import ElementTree

tree = ElementTree.parse('Store.xml')
root = tree.getroot()

for att in root:
    first = att.find('shops').text
    print('{}'.format(first))

但我在这里 None。

Shops 没有文字,因此不会打印任何内容。你需要降到你想要的水平

for att in root.findall('./data/shops/shop’):
    first = att.find('name')
    print('{}'.format(first.text))

给予

Bannockburn
Plainfield - North Plainfield

这里有一个很好的 ElementTree 资源:https://docs.python.org/3/library/xml.etree.elementtree.html

这不是一个完整的解决方案,但可以回答您获得 None 的原因,因为您的商店实际上更深一层,在 data 标签下。

这段代码可能会让您了解如何访问底层属性,您可以将这些属性收集到列表或其他容器中以构建您的 CSV。

from xml.etree import ElementTree

tree = ElementTree.parse('Store.xml')
root = tree.getroot()
data = root.find('data')

for shops in data:
    for shop in shops:
        name = shop.find('name').text
        sid = shop.attrib
        status = shop.find('status').text
        attrs = shop.find('shopAttributes')
        open_date = attrs.find(".//shopAttribute/[@attrName='shop_OPEN_DATE']").text
        print(f"Name: {name}, ID: {sid}, Status: {status}, open: {open_date}")

open_date 是如何使用 XPath 访问属性的示例。代码returns:

Name: Bannockburn, ID: {'id': '204019'}, Status: Open, open: 2008-07-16
Name: Plainfield - North Plainfield, ID: {'id': '204020'}, Status: Open, open: 2007-05-18