BMECatReader2005 liest file nicht ein

Hallo Team,

ich habe hier eine BMECat-Datei, die der Step partout nicht einlesen will. Angeblich sei ein Tag nicht geschlossen:

Fehler während der Konfiguration des Steps A-2 Mapper (Verursacher: A-1 BMECat2005Reader) Fehler: Error in (Sub)-Step XMLFileSplitter PRODUCT (46) (Root Causes: XMLStreamException: ParseError at [row,col]:[20,9] Message: The element type "FIRST_NAME" must be terminated by the matching end-tag "</FIRST_NAME>".)

Ich schaue mir die Datei an und sehe da aber keinerlei Fehler - hier ist der beanstandete Abschnitt:

Wo ist das Problem? Und: Welchen output-type muß ich hier überhaupt wählen, es scheint keiner zu passen. Die XML hat folgende Anfangsstruktur:

image

Ich vermute ja, daß der im Hintergrund laufende XMLSplitter irgendwie versucht, die Datei an PRODUCT-Stellen zu splitten, was vermutlich wegen des gewählten output-type so ist. Ich habe da aber schon verschiedene ausprobiert mit immer demselben Ergebnis. Meinem Verständnis nach müßte etwas gewählt werden, das den Splitter nicht PRODUCT- sondern ORDER-Tags splitten läßt.

Danke und Gruß, Micha
podcomm e-commerce management

Guten Morgen Micha,

kannst du uns eventuell die XML Datei (per Ticket) zur Verfügung stellen?

Vielen Grüße
Torsten

Hallo Torsten,

Ticket habe ich eben erstellt.

Gruß Micha

Hallo Micha,

vielen Dank für die Datei. Das ist leider keine BMECat XML, auch wenn teilweise Elemente mit dem Namespace xmlns="http://www.bmecat.org/bmecat/2005" enthalten sind. ORDER Elemente sind in der BMECat 2005 Spezifikation nicht vorhanden (siehe Downloads BMEcat).
Ich denke, dass es sich bei der XML um eine Bestellung im openTRANS (2.1) Format handelt.

Da gibt es bei einigen XML Elementen Überschneidungen zu BMECat, was den namespace dieser Element erklärt.

Viele Grüße
Torsten

Okay, danke soweit. Am Anfang hatte ich es versucht, normal über den XMLReader zu parsen, das hatte aber nicht geklappt. Dann stieß ich auf diesen anderen namespace und dachte „ist wohl BMECat“. Okay, dann muß ich weiter suchen. Vielleicht kannst Du mir noch einen Tip geben - Du siehst ja die ns-Deklaration in der XML. Meines Erachtens muß ich dem Parser das hier voranstellen:
<#ftl ns_prefixes={„D“:„http://www.opentrans.org/XMLSchema/2.1“, „xsi“:„http://www.w3.org/2001/XMLSchema-instance“, „xsd“:„XML Schema“}>

Er liest aber nur Segmente ein, die so aussehen:
<ORDER_ID>73057919</ORDER_ID>
Sobald ein Segment so etwas hat:

bekomme ich einen Fehler
Fehler beim Ausführen eines Freemarker Skripts. Fehler beim Parsing der 1. Datei GORDP_7592024_73057919.xml. In den meisten Fällen ist die Datei leer, kaputt oder ist inhaltlich fehlerhaft, so dass Sie nicht geparst werden kann. Fehler in XML-Parsing Code: (verantwortliche Code-Stelle: - Failed at: ${row.addCol(„billingCustomerLanguage… [in template „xmlToSpreadsheet“ at line 8, column 17] ) (Root Causes: _TemplateModelException: No compatible overloaded variation was found; can’t convert (unwrap) the 2nd argument to the desired Java type. The FTL type of the argument values were: string (wrapper: f.t.SimpleScalar), sequence+hash (wrapper: f.e.dom.NodeListModel). The matching overload was searched among these members: com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String, String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String, com.synesty.csvconverter.api.converter.ColFactory), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String) ---- FTL stack trace (“~" means nesting-related): - Failed at: ${row.addCol("billingCustomerLanguage… [in template „xmlToSpreadsheet“ at line 8, column 17] ----)

Also muß er sich ja an diesem "xmlns=„http://www.bmecat.org/bmecat/2005“ stören - wie komme ich denn hier weiter?

Du kannst das bmecat.org Prefix mit in die ns_prefixes mit hinten dran zu schreiben (siehe):

Irgendwie so:

<#ftl ns_prefixes={"D":"http://meistensirgendeinelangeurl.de/", "xmlns":"http://www.bmecat.org/bmecat/2005"}>

Das Problem ist vermutlich ein anderes:

Du hast dort irgendein Element am Wickel, von dem du meinst, dass es ein String ist, es ist aber unter Haube eine Liste. Evtl. kommt das <LANGUAGE> Tag irgendwo mal mehrfach vor. Dann wird es generell als Liste angenommen. D.h. du müsstest dirt da irgendwie das erste Element nehmen.

Nein, ich habe den Parsing-Code für die Tests extrem vereinfacht. Er soll nur drei Elemente einlesen, d.h. der LANGUAGE-Tag kommt nur einmal vor und ist genau so wie ich es beschrieben habe. Und dieses Hinzufügen hat auch nicht geklappt. Ich bin ratlos.
Wenn ich die Datei ändere und diesen Mist bei LANGUAGE rausnehme, so daß nur stehen bleibt:
ger
liest er das Segment problemlos ein.
UPDATE: Da nichts klappt, mache ich es jetzt anders und schmeiße diesen String per FileFindAndReplace vor dem Parsen raus - damit funktioniert es.

Hallo Micha,

du kannst den namespace einfach mit einem anderen bei den ns_prefixes angeben (wie oben beschrieben. Wenn du dann auf das Element zugreifst musst du den Präfix allerdings mit angeben:

Beispiel

<#ftl ns_prefixes={"D":"http://www.opentrans.org/XMLSchema/2.1","xmlns":"http://www.bmecat.org/bmecat/2005"}>
<#assign row = target.addRow()>
<#list xml["ORDER"]["ORDER_HEADER"]["ORDER_INFO"] as book>
  <#assign row = target.addRow()>
   ${row.addCol("lang", book["xmlns:LANGUAGE"] )}
 </#list>

Ach so, danke! Das habe ich zu spät gelesen. Egal, jetzt weiß ich’s fürs nächste Mal, aber die Lösung mit dem FindAndReplace klappt auch.

1 Like