XML в CSV, но те же теги под родителем - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть такой XML-файл, и я пытаюсь преобразовать его в CSV с помощью библиотеки Python xml2csv.Но есть тег изображения , который нарушает все.Я хочу получить все теги image в другом столбце.Как мне этого добиться?

Спасибо,

<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>

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018
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']
0 голосов
/ 30 декабря 2018

Как вы уже догадались, проблема в том, что каждый узел product имеет несколько img_item тегов, которые xml2csv не знает, как обрабатывать (и, просматривая свою документацию, похоже, не имеет возможностидайте ему знать, как обрабатывать эти узлы).

Однако вы можете сделать это довольно легко, используя встроенный модуль csv.Вам просто нужно решить, как вы хотите разделить URL-адреса различных изображений.В приведенном ниже примере я решил использовать ; (очевидно, вы не можете использовать ,, если не используете другой разделитель для столбцов).

Также обратите внимание, что я жестко закодировал заголовки.Это (вполне) можно легко изменить, чтобы заголовки динамически обнаруживались из подэлементов узла product.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...