Merhaba kendi büyük xml dosyalarımı dönüştürmek için kullandığım kodu sizinle paylaşiyorum bu kod ile 100 gblik büyük xml dosyalarını api servere dönüştürüp istediginiz yerde kullanım kolaylığı sağlıyor.
aşağıda verdigim kodu xml_url yerine kendi xml urlniiz yapiştirin ve py dosyası olarak kaydedin çalıştırın
url parametreleri şöyle; siteniz.com/api/products/1 - burda ürün idsini xml den apiye dönüştürüp çekiyor siteniz.com/api/products?showid=true - burda xmlde olan tüm ürün idlerini json olarak götseriyor.. from flask import Flask, jsonify, request
import requests
import xml.etree.ElementTree as ET
import time
import html
app = Flask(__name__)
# XML dosyasının URL'si
xml_url = 'https://site.com/1.xml'
# Tüm ürünleri saklayacak bir liste
products = []
def process_xml():
global products
# XML dosyasını indirme
response = requests.get(xml_url)
# XML dosyasını bir dosyaya yazma
with open('products.xml', 'wb') as f:
f.write(response.content)
# XML dosyasını açma ve ürünleri alarak listeye ekleme
tree = ET.parse('products.xml')
root = tree.getroot()
products.clear()
for product_element in root.findall('Product'):
product = {
'Id': product_element.get('Id'),
'ModelCode': product_element.get('ModelCode'),
'Sku': product_element.get('Sku'),
'Gtin': product_element.get('Gtin'),
'Name': html.unescape(product_element.get('Name')),
'Manufacturer': html.unescape(product_element.get('Manufacturer')),
'FullDescription': html.unescape(product_element.get('FullDescription')),
'StockQuantity': product_element.get('StockQuantity'),
'Price': product_element.get('Price'),
'OldPrice': product_element.get('OldPrice'),
'Tax': product_element.get('Tax'),
'Pictures': [picture.get('Path') for picture in product_element.findall('./Pictures/Picture')],
'Categories': [html.unescape(category.get('Path')) for category in product_element.findall('./Categories/Category')],
'Combinations': [{
'Id': combination.get('Id'),
'Sku': combination.get('Sku'),
'Gtin': combination.get('Gtin'),
'StockQuantity': combination.get('StockQuantity'),
'OverriddenPrice': combination.get('OverriddenPrice'),
'Attributes': [{'Name': attr.get('Name'), 'Value': attr.get('Value')} for attr in combination.findall('./Attributes/Attribute')]
} for combination in product_element.findall('./Combinations/Combination')],
'Specifications': [{'Name': spec.get('Name'), 'Value': html.unescape(spec.get('Value'))} for spec in product_element.findall('./Specifications/Specification')]
}
products.append(product)
# Flask API endpoint'i
@app.route('/api/products', methods=['GET'])
def get_products():
process_xml()
show_id = request.args.get('showid') # showid parametresini al
if show_id: # Eğer showid parametresi varsa
ids = [product['Id'] for product in products] # Tüm ID'leri al
return jsonify(ids) # Tüm ID'leri JSON formatında gönder
else:
return jsonify(products) # Tüm ürünleri JSON formatında gönder
@app.route('/api/products/<int:id>', methods=['GET'])
def get_product_by_id(id):
process_xml()
product = next((p for p in products if p['Id'] == str(id)), None) # ID'ye göre ürünü bul
if product:
return jsonify(product) # Bulunan ürünü JSON formatında gönder
else:
return jsonify({'message': 'Product not found'}), 404 # Ürün bulunamazsa hata kodu 404 döndür
if __name__ == '__main__':
# İşlemi belirli aralıklarla gerçekleştirme
while True:
process_xml()
time.sleep(60) # 60 saniyede bir kontrol etme
app.run(debug=True)