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:
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
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.
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] ----)
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.
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: