Table of Contents
Struktura XML powstała z myślą o eksporcie produktów z platform Prestashop oraz thirtybees. Celem formatu jest odzwierciedlenie struktury produktowej używanej w w/w platformach.
Struktura XML w wersji 3
Zmiany w wersji 3:
- ustandaryzowanie pól językowych, aby praktycznie każdy element opisowy mógł zawierać wielojęzyczność
- zmieniona struktura przechowująca opis, opis krótki i nazwę produktu
- Zamiana elementu
<p> » <id>
na atrybut elementu:`<p id="n">`
- Zamiana elementu
<c> » <id_product_attribute>
na atrybut elementu: - Zmiana pola
quantity
nastock
- jak jest w głównym obiekcie produktu
<c id="n">
Definicja typów danych
Każdy z elementów XML powinien zachować określony typ danych. Definicje typów danych i ich oznaczenia:
-
{type:#int}
Liczba naturalna >= 0 -
{type:#id_reference}
Identyfikator. Zalecany format:a-zA-Z0-9_-
-
{type:#char}
ciąg znaków -
{type:#ean13}
13 cyfrowy ciąg liczbowy -
{type:#string}
- ciąg znaków a-z -
{type:#string_cdata}
jak wyżej, zalecane zamknięcie w CDATA -
{type:#vat}
Wartość VAT w formie % bez znaku procent. Tj.0
5
8
23
etc. -
{type:#float}
Wartość zmiennoprzecinkowa -
{type:#float:n}
Wartość zmiennoprzecinkowa zaokrąglona do n{type:#float:3}
wartość zaokrąglna do 3 miejsc po przecinku -
{type:#url}
Adres URL -
{type:#unit_weight}
Jednostka Wagi. Domyślnie kg -
{type:#iso_lang}
Kod języka ISO 639-1pl
,en
lub kod języka IETF ( IETF Language tag )pl-PL
-
{type:#iso_currency}
Kod walutyISO 4217
(PLN, USD, GPB etc.)
Wielojęzyczność
Dla uproszczenia elementy wielojęzykowe w XML będziemy oznaczali jako {xml:#lang}
.
Oznacza to, że elementy tak oznaczone, zawierać mogą prosty ciąg znaków, lub zbiór elementów <lang>
Definicja
<?xml version="1.0" encoding="utf-8"?>
<root>
<!-- Pełny obiekt językowy -->
<obiekt_jezykowy>
<!-- Obiekt powinien, ale nie musi zawierać tagu CDATA -->
<lang iso="{type:#iso_lang}">{type:#string_cdata}</lang>
<lang iso="{type:#iso_lang}">{type:#string_cdata}</lang>
<lang iso="{type:#iso_lang}">{type:#string_cdata}</lang>
<lang iso="{type:#iso_lang}">{type:#string_cdata}</lang>
</obiekt_jezykowy>
<!-- Uproszczony obiekt językowy (w przypadku tylko 1 języka) -->
<obiekt_jezykowy>{type:#string_cdata}</obiekt_jezykowy>
</root>
Przykłady
Zakładając uproszczony przykład XML zawierającego tylko 1 element <description>
<?xml version="1.0" encoding="utf-8"?>
<root>
<description>{xml:#lang}</description>
</root>
Oznacza to, że tak zapisany abstrakt oznacza następujące możliwe fromaty:
<?xml version="1.0" encoding="utf-8"?>
<root>
<description>Opis produktu lorem ipsum</description>
</root>
i/lub
<?xml version="1.0" encoding="utf-8"?>
<root>
<description>
<lang iso="pl">opis</lang>
<lang iso="en">description</lang>
<lang iso="de">Beschreibung</lang>
<lang iso="fr">la description</lang>
</description>
</root>
Struktura Pliku XML
Definicja w formacie XML
<?xml version="1.0" encoding="utf-8"?>
<root sxfversion="3.0" gendate="2000-01-01 00:00:00" currency="{type:#iso_currency}">
<categories>
<c id="{type:#id_reference}" id_parent="{type:#id_reference}">{xml:#lang}</c>
</categories>
<products>
<p id="{type:#id_reference}">
<name>{xml:#lang}</name>
<description>{xml:#lang}</description>
<description_short>{xml:#lang}</description_short>
<reference>{type:#id_reference}</reference> <!-- Kod nadany przez producenta -->
<ean13>{type:#ean13}</ean13> <!-- EAN13 -->
<stock>{type:#int}</stock> <!-- Stan magazynowy produktu (W przypadku posiadania kombinacji, suma stanów kombinacji) -->
<price> <!-- Ceny zakupu, z uwzględnieniem zniżek -->
<tax>{type:#vat}</tax> <!-- Podatek w % jako liczba -->
<srp>{type:#float}</srp> <!-- Cena netto SRP / Cena bez rabatu -->
<price>{type:#float}</price> <!-- Cena Netto zakupu | Przykład pokazuje rabat 50% -->
</price>
<tags>
<lang iso="{type:#iso_lang}">
<tag>{type:#char}</tag>
</lang>
</tags>
<tags> <!-- Dla plików jednojęzykowych nie trzeba definiować <lang> -->
<tag>{type:#char}</tag>
</tags>
<weight unit="{type:#unit_weight}">{type:#float}</weight>
<manufacturer id="{type:#id_reference}">{xml:#lang}</manufacturer>
<cat id="{type:#id_reference}"/>
<images> <!-- Wszystkie zdjęcia -->
<img id="{type:#id_reference}">{type:#url}</img>
</images>
<features>
<f>
<name id="{type:#id_reference}">{xml:#lang}</name>
<value id="{type:#id_reference}">{xml:#lang}</value>
</f>
<f>
<name id="{type:#id_reference}">{xml:#lang}</name>
<value id="{type:#id_reference}">{xml:#lang}</value>
</f>
</features>
<combinations>
<c id="{type:#id_reference}"> <!-- Kombinacja - może być wiele -->
<reference>{type:#id_reference}</reference>
<ean13>{type:#ean13}</ean13>
<price> <!-- Zawiera ostateczną cenę produktu w tej kombinacji -->
<srp>{type:#float}</srp> <!-- Cena netto SRP - Zalecana cena sprzedaży -->
<price>{type:#float}</price> <!-- Cena Netto sprzedaży - ile klient końcowy płaci za twoar -->
</price>
<default>{type:#int}</default> <!-- 1 lub 0 . Tylko 1 atrybut może mieć wartość 1, co oznacza że jest to główny atrybut -->
<weight_impact>{type:#float}</weight_impact><!-- Wpływ na wagę (waga atrybutu = waga produktu + weight_impact) -->
<stock>{type:#int}</stock>
<subname>{xml:#lang}</subname>
<images> <!-- Zdjęcia przypisane do konkretnej kombinacji -->
<img id="{type:#id_reference}">{type:#url}</img>
</images>
<attributes>
<a>
<name>{xml:#lang}</name>
<value>{xml:#lang}</value>
</a>
</attributes>
</c>
</combinations>
</p>
</products>
</root>
Opis pól
Z
- pole zalecane; -
nie dotyczy
Pole | Wymagane | Wielojęzykowe | Unikalny | Opis |
---|---|---|---|---|
root > | Y | N | Y | Element główny |
> categories | Y | N | Y | Informacje o kategoriach |
> categories > c | Y | N | N | Element opisujący jedną kategorię. Wartość to nazwa kategorii (bez pełnej ścieżki) |
> categories > c:id | Y | - | Y | Unikalne ID kategorii |
> categories > c:id_parent | Y | - | Y | ID kategorii nadrzędnej. 0 dla kategorii głównej |
root > products | Y | - | Y | |
root > products > p:id | Tożsame z elementem id | |||
root > products > p > | Y | - | N | Element produktu |
> name | Y | Y | Y | |
> description | Z | Y | Y | |
> description_short | Z | Y | Y | |
> reference | Z | N | Y | |
> ean13 | Z | N | Y | |
> stock | Y | - | Y | |
> price | Y | - | Y | |
> price > tax | Y | - | Y | |
> price > srp | N | - | Y | |
> price > price | Y | - | Y | |
> tags | N | Struktura językowa tego pola posiada inną definicję językową niż reszta pól | ||
> tags > lang | Y/N | Niewymagane dla plików jednojęzykowych | ||
> tags > lang:iso | Y/N | Niewymagane dla plików jednojęzykowych | ||
> tags > lang > tag | Y | Wymagane, może być umieszczone w tagu lang lub poza nim | ||
> weight | N | - | Y | |
> manufacturer | N | Y | Y | |
> manufacturer:id | N | - | Y | |
> cat | Y | - | N | Element z bez wartości - pierwszy element jest kategorią domyślną produktu |
> cat:id | Y | - | Y | Atrybut z ID kategorii – root > categories > c:id |
> images | Z | - | Y | Element powinien być dodawany tylko jeśli zawiera podelementy |
> images img | Y | - | N | Wartośc pola do adres URL zdjęcia |
> images img:id | N | - | Y | |
> images img:hash | N | - | Y | Hash może być zarówno datą jak i sumą kontrolną |
> features | N | Y | Element powinien być dodawany tylko jeśli zawiera podelementy | |
> features > f | Y | - | N | Element zawierający informację o 1 cesze |
> features > f > name | Y | Y | Y | Nazwa cechy np. Materiał |
> features > f > name:id | N | - | Y | Unikalne ID cechy z systemu generującego |
> features > f > value | Y | Y | N | Element można dodawać wielokrotnie, jeśli system obsługuje wiele cech |
> features > f > value:id | N | - | Y | |
> combinations | N | - | Y | |
> combinations > c > | Y | - | N | Element kombinacji |
> c:id | Y | - | Y | |
> c > reference | Z | N | Y | |
> c > ean13 | Z | N | Y | |
> c > price | N | - | Y | Struktura obiektu price jest taka sama jak w głównym produkcie “p > price” lecz nie wymaga elementu “tax” |
> c > default | N | - | Y | |
> c > weight_impact | N | - | Y | |
> c > stock | Y | - | Y | Wcześniej była to wartość “quantity” |
> c > subname | N | Y | Y | |
> c > images | N | - | Y | |
> c > images > img | Y | - | N | |
> c > images > img:id | N | - | Y | |
> c > images > attributes | N | - | Y | |
> c > images > attributes > a | Y | - | N | |
> c > images > attributes > a > name | Y | Y | Y | |
> c > images > attributes > a > value | Y | Y | Y |
Przykładowe Pliki XML
Wielojęzykowy plik XML
Zarówno w format wielojęzyczny jak i jednojęzyczny może zawierać elementy jedno i wielojęzykowe.
<?xml version="1.0" encoding="utf-8"?>
<root sxfversion="2.0" gendate="2000-01-01 00:00:00" currency="PLN">
<categories>
<c id="1" id_parent="0">
<lang iso="en"><![CDATA[Haberdashery]]></lang>
<lang iso="pl"><![CDATA[Pasmanteria]]></lang>
<lang iso="de"><![CDATA[Kurzwaren]]></lang>
<lang iso="de"><![CDATA[Галантерея]]></lang>
</c>
<c id="2" id_parent="1">
<lang iso="en"><![CDATA[laces]]></lang>
<lang iso="pl"><![CDATA[Sznurówki]]></lang>
<lang iso="de"><![CDATA[Schnürsenkel]]></lang>
<lang iso="de"><![CDATA[шнурки]]></lang>
</c>
</categories>
<products>
<p id="1">
<name>
<lang iso="en"><![CDATA[Product Name]]></lang>
<lang iso="pl"><![CDATA[Nazwa produktu]]></lang>
<lang iso="de"><![CDATA[Produktname]]></lang>
<lang iso="de"><![CDATA[наименование товара]]></lang>
</name>
<description>
<lang iso="en"><![CDATA[Long description of a product]]></lang>
<lang iso="pl"><![CDATA[Długi opis produktu]]></lang>
<lang iso="de"><![CDATA[Lange Beschreibung eines Produkts]]></lang>
<lang iso="de"><![CDATA[Длинное описание продукта]]></lang>
</description>
<description_short>
<lang iso="en"><![CDATA[short description of a product]]></lang>
<lang iso="pl"><![CDATA[Krótki opis produktu]]></lang>
<lang iso="de"><![CDATA[kurze Beschreibung eines Produkts]]></lang>
<lang iso="ru"><![CDATA[краткое описание продукта]]></lang>
</description_short>
<reference>ABC_XYZ-1</reference> <!-- Kod nadany przez producenta -->
<ean13>1234567890123</ean13> <!-- EAN13 -->
<stock>5</stock> <!-- Stan magazynowy produktu (W przypadku posiadania kombinacji, suma stanów kombinacji) -->
<price> <!-- Ceny zakupu, z uwzględnieniem zniżek -->
<tax>23</tax> <!-- Podatek w % jako liczba -->
<srp>200</srp> <!-- Cena netto SRP / Cena bez rabatu -->
<price>160.33</price> <!-- Cena Netto zakupu | Przykład pokazuje rabat 50% -->
</price>
<weight unit="kg">0.25</weight>
<manufacturer id="1">
<lang iso="en"><![CDATA[Manufacturer of shoelaces]]></lang>
<lang iso="pl"><![CDATA[Producent sznurówek]]></lang>
<lang iso="de"><![CDATA[Hersteller von Schnürsenkeln]]></lang>
<lang iso="de"><![CDATA[Производитель шнурков]]></lang>
</manufacturer>
<tags>
<lang iso="pl">
<tag>Czerwony</tag>
<tag>Wielokolorowy</tag>
</lang>
<lang iso="en">
<tag>Reddish</tag>
<tag>Red</tag>
<tag>Multicolor</tag>
</lang>
</tags>
<cat id="2"/>
<images> <!-- Wszystkie zdjęcia -->
<img id="1" hash="2020-01-03">https://example.com/images/1.jpg</img>
<img id="2" hash="a8f5f167f44f4964e6c998dee827110c">https://example.com/images/2.jpg</img>
</images>
<features>
<f>
<name id="1">
<lang iso="en"><![CDATA[Length]]></lang>
<lang iso="pl"><![CDATA[Długość]]></lang>
<lang iso="de"><![CDATA[Länge]]></lang>
<lang iso="ru"><![CDATA[длина]]></lang>
</name>
<value id="1">
<lang iso="en"><![CDATA[Long]]></lang>
<lang iso="pl"><![CDATA[Długa]]></lang>
<lang iso="de"><![CDATA[Lange]]></lang>
<lang iso="ru"><![CDATA[Length in cm]]></lang>
</value>
</f>
<f>
<name id="2">
<lang iso="en"><![CDATA[Purpose]]></lang>
<lang iso="pl"><![CDATA[Przeznaczenie]]></lang>
<lang iso="de"><![CDATA[Zweck]]></lang>
<lang iso="ru"><![CDATA[Цель]]></lang>
</name>
<value id="3">
<lang iso="en"><![CDATA[party]]></lang>
<lang iso="pl"><![CDATA[imprezowe]]></lang>
<lang iso="de"><![CDATA[party]]></lang>
<lang iso="ru"><![CDATA[партия]]></lang>
</value>
<value id="4">
<lang iso="en"><![CDATA[casual]]></lang>
<lang iso="pl"><![CDATA[beiläufig]]></lang>
<lang iso="de"><![CDATA[beiläufig]]></lang>
<lang iso="ru"><![CDATA[повседневная]]></lang>
</value>
</f>
<f>
<name id="3">
<lang iso="en"><![CDATA[Length in cm]]></lang>
<lang iso="pl"><![CDATA[Długość w cm]]></lang>
<lang iso="de"><![CDATA[Länge in cm]]></lang>
<lang iso="ru"><![CDATA[Длина в см]]></lang>
</name>
<value id="5">15cm</value>
</f>
</features>
<combinations>
<c id="1">
<reference>XYZ_C1</reference>
<ean13>1231231231234</ean13>
<price>
<srp>50</srp>
<price>25</price>
</price>
<default>1</default>
<weight_impact>0.5</weight_impact>
<stock>5</stock>
<subname>
<lang iso="en"><![CDATA[Sznurówki]]></lang>
<lang iso="pl"><![CDATA[Sznurówki]]></lang>
<lang iso="de"><![CDATA[Sznurówki]]></lang>
</subname>
<images> <!-- Zdjęcia przypisane do konkretnej kombinacji -->
<img id="2">https://example.com/images/2.jpg</img>
</images>
<attributes>
<a>
<name>
<lang iso="en"><![CDATA[Color]]></lang>
<lang iso="pl"><![CDATA[Kolor]]></lang>
<lang iso="de"><![CDATA[Farbe]]></lang>
<lang iso="ru"><![CDATA[цвет]]></lang>
</name>
<value>
<lang iso="en"><![CDATA[green]]></lang>
<lang iso="pl"><![CDATA[zielone]]></lang>
<lang iso="de"><![CDATA[grün]]></lang>
<lang iso="ru"><![CDATA[зеленый]]></lang>
</value>
</a>
</attributes>
</c>
</combinations>
</p>
</products>
</root>
Uproszczony, jednojęzykowy plik XML
<?xml version="1.0" encoding="utf-8"?>
<root sxfversion="2.0" gendate="2000-01-01 00:00:00" currency="PLN">
<categories>
<c id="1" id_parent="0"><![CDATA[Pasmanteria]]></c>
<c id="2" id_parent="1"><![CDATA[Sznurówki]]></c>
</categories>
<products>
<p id="1">
<name><![CDATA[Nazwa produktu]]></name>
<description><![CDATA[Długi opis produktu]]></description>
<description_short><![CDATA[Krótki opis produktu]]>
</description_short>
<reference>ABC_XYZ-1</reference> <!-- Kod nadany przez producenta -->
<ean13>1234567890123</ean13> <!-- EAN13 -->
<stock>5</stock> <!-- Stan magazynowy produktu (W przypadku posiadania kombinacji, suma stanów kombinacji) -->
<price> <!-- Ceny zakupu, z uwzględnieniem zniżek -->
<tax>23</tax> <!-- Podatek w % jako liczba -->
<srp>200</srp> <!-- Cena netto SRP / Cena bez rabatu -->
<price>160.33</price> <!-- Cena Netto zakupu | Przykład pokazuje rabat 50% -->
</price>
<tags>
<tag>Czerwony</tag>
<tag>Kolorowy</tag>
</tags>
<weight unit="kg">0.25</weight>
<manufacturer id="1"><![CDATA[Producent sznurówek]]> </manufacturer>
<cat id="2"/>
<images> <!-- Wszystkie zdjęcia -->
<img id="1" hash="2020-01-03">https://example.com/images/1.jpg</img>
<img id="2" hash="a8f5f167f44f4964e6c998dee827110c">https://example.com/images/2.jpg</img>
</images>
<features>
<f>
<name id="1"><![CDATA[Długość]]></name>
<value id="1"><![CDATA[Długa]]></value>
</f>
<f>
<name id="2"><![CDATA[Przeznaczenie]]></name>
<value id="3"><![CDATA[imprezowe]]></value>
<value id="4"><![CDATA[beiläufig]]></value>
</f>
<f>
<name id="3"><![CDATA[Długość w cm]]></name>
<value id="5">15cm</value>
</f>
</features>
<combinations>
<c id="1">
<reference>XYZ_C1</reference>
<ean13>1231231231234</ean13>
<price>
<srp>50</srp>
<price>25</price>
</price>
<default>1</default>
<weight_impact>0.5</weight_impact>
<stock>5</stock>
<subname><![CDATA[Sznurówki Zielone]]></subname>
<images> <!-- Zdjęcia przypisane do konkretnej kombinacji -->
<img id="2">https://example.com/images/2.jpg</img>
</images>
<attributes>
<a>
<name><![CDATA[Kolor]]></name>
<value><![CDATA[zielone]]></value>
</a>
</attributes>
</c>
</combinations>
</p>
</products>
</root>