如何使用 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
特此附上我要转换为 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