Python XML转换为CSV,但父项下的标记相同

Python XML转换为CSV,但父项下的标记相同,python,excel,xml,Python,Excel,Xml,我有一个这样的XML文件,并试图用xml2csv python库将其转换为CSV。但是有一个图像标签会破坏一切。我想在不同的列上获得所有标记。我怎样才能做到这一点 谢谢 <products> <product> <code>722</code> <ws_code>B515C16CRU</ws_code> <supplier_code>B515C16CRU&l

我有一个这样的XML文件,并试图用xml2csv python库将其转换为CSV。但是有一个图像标签会破坏一切。我想在不同的列上获得所有标记。我怎样才能做到这一点

谢谢

<products>
    <product>
        <code>722</code>
        <ws_code>B515C16CRU</ws_code>
        <supplier_code>B515C16CRU</supplier_code>
        <images>
            <img_item type_name="">
            https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3378-72-B.jpg
            </img_item>
            <img_item type_name="">
            https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3379-72-B.jpg
            </img_item>
            <img_item type_name="">
            https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3380-72-B.jpg
            </img_item>
        </images>
    </product>
    .... 
</products>

正如您可能已经猜到的,问题是因为每个
产品
节点都有多个
img_项
标记,
xml2csv
不知道如何处理这些标记(并且在查看其文档时,似乎没有让其知道如何处理这些节点的选项)

但是,您可以使用内置的
csv
模块轻松地完成这项工作。您只需要决定如何划分不同图像的URL。在下面的示例中,我决定使用
(显然不能使用
,除非对列使用另一个分隔符)

还要注意,我硬编码了标题。这可以(相当)容易地更改,以便从
产品
节点的子元素动态检测头

import csv
import xml.etree.ElementTree as ET

string = '''<products>
    <product>
        <code>722</code>
        <ws_code>B515C16CRU</ws_code>
        <supplier_code>B515C16CRU</supplier_code>
        <images>
            <img_item type_name="">https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3378-72-B.jpg</img_item>
            <img_item type_name="">https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3379-72-B.jpg</img_item>
            <img_item type_name="">https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3380-72-B.jpg</img_item>
        </images>
    </product>
</products>'''

root = ET.fromstring(string)

headers = ('code', 'ws_code', 'supplier_code', 'images')

with open('test.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=headers)
    writer.writeheader()
    for product in root.iter('product'):
        writer.writerow({'code': product.find('code').text,
                         'ws_code': product.find('ws_code').text,
                         'supplier_code': product.find('supplier_code').text,
                         'images': ';'.join(img.text for img in product.iter('img_item'))})
将生成以下CSV:

code,ws_code,supplier_code,images
722,B515C16CRU,B515C16CRU,https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3378-72-B.jpg;https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3379-72-B.jpg;https://www.apparel.com.tr/stance-corap-cruker-grey-orap-stance-ankle-bters-3380-72-B.jpg

我的控制台上出现
xml.etree.ElementTree.ParseError:格式不正确(无效令牌):第28行第2列
错误。@Omercan这意味着您尝试使用的xml文件格式不正确。
我确信格式正确。因为xml2csv正在给出输出,所以您可以将您试图正确格式解析的实际文件添加到您的问题中。以下是链接:[注释不用于扩展讨论;此对话已完成。
import xml.etree.ElementTree as ET
import csv
import re

class xml_to_csv:
def do(self):
   #self.xml_file_location = input("Enter full path of XML file(Eg =                   D:\programs\ResidentData.xml) : ")
   self.tree = ET.parse("urunler-fotolu.xml")
   self.root = self.tree.getroot()
   self.csv_file_location = input("Enter full path to store CSV file(Eg = D:\programs\csv_file.csv ) : ")
   self.csv_data = open(self.csv_file_location, 'w')
   self.csv_writer = csv.writer(self.csv_data)
   self.find_records(self.root)

def find_attributes(self,record):
   temp = []
   dont_do = 0
   for j in record:
       temp = temp + self.find_attributes(j)
       dont_do = 1
   if(dont_do == 0):
       return [record.text]
   return temp

def find_records(self,root1):
    for i in root1:
        csv_record = self.find_attributes(i)

        sz = len(csv_record)
        i=0
        while (i<sz):
            if csv_record[i][0] == '\n':
                 csv_record[i] = csv_record[i][1:len(csv_record[i])-1]
            i = i+1;
        print(csv_record)
        self.csv_writer.writerow(csv_record)


if __name__ == "__main__":
    obj = xml_to_csv()
    obj.do()
For this = """
     <State>
       <Resident Id="100">
          <Name>Sample Name</Name>
          <PhoneNumber>1234567891</PhoneNumber>
          <EmailAddress>sample_name@example.com</EmailAddress
          <Address>
                        <StreetLine1>Street Line1</StreetLine1>
                        <City>City Name</City>
                        <StateCode>AE</StateCode>
                        <PostalCode>12345</PostalCode>
          </Address>
     </Resident>
     </State>
"""
  ['Sample Name', '1234567891', 'sample_name@example.com', 'Street Line1', 'City Name', 'AE', '12345']