Data Import Handler & XML – zagnieżdzone encje

Data Import Handler jest bardzo miłym i rozbudowanym narzędziem. Poniżej opis problemu (i rozwiązania) w którym spotkałem się ostatnio.

Opis Problemu

Do zaindeksowania jest pewna lista produktów. Produkty jednak mogą być łączone w grupy. Dodatkowo w grupie, w kolejnych elementach mogą być pominięte te dane, które w elemencie wcześniej zostały zdefiniowane. Przykładowa struktura (nieistotne informacje pominąłem dla czytelności):

<products>
  <product>
    <id>1</id>
    <name>Product 1</name>
  </product>
  <product>
    <id>2</id>
    <name>Product 2</name>
  </product>
  <group>
    <product>
      <id>3</id>
      <name>Product 3 and 4</name>
    </product>
    <product>
      <id>4</id>
    </product>
  </group>
</products>

Rozwiązanie

Rozwiązanie polega na zdefiniowaniu – jak zawszę – elementu „entity” w sposób następujący:

<entity processor="XPathEntityProcessor"
    forEach="/products/product | /products/group/product">
  <field column="id" xpath="//id" />
  <field column="name" xpath="//name" commonField="true" />
</entity>

Wyjaśnienie

Dzięki takiej konstrukcji „forEach” do przetworzenia dostaną się zarówno produkty nie należące do grupy, jak i te w grupach. Istotnym atrybutem pola jest „commonField”. Informuje on DIH, że jeśli w danym rekordzie nie jest zdefiniowane to pole, należy je pobrać z rekordu poprzedniego.

Podane rozwiązanie ma parę ograniczeń, np. pierwszy element w grupie powinien mieć zdefiniowane pole „name” oraz ważna jest kolejność produktów, natomiast w moim przypadku pokrywało się to dokładnie ze specyfikacją dostarczonego pliku importu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *