Mithilfe der Formaterkennung XPATH können beliebige XML-Dateien analysiert werden und ein entsprechendes FORMAT-Objekt erstellt werden.
Zur Einrichtung muss die Extension B3P_FORMAT_RECOGNITION_REGISTRY wie folgt erweitert werden:
_unknown=XPathAnalyzer
XPathAnalyzer.presentationAnalyzerClass=org.b2bbp.format.recognition.analyzer.XPathAnalyzer
XPathAnalyzer.formatAnalyzerClass=org.b2bbp.format.recognition.analyzer.XPathAnalyzer
Falls die Zeile _unknown schon existiert, muss XPathAnalyzer
drangehängt werden. Das Trennzeichen muss ein Semikolon sein, z.B.
_unknown=WetterMeteomedia;XpathAnalyzer
Um die eigentliche Formaterkennung zu konfigurieren, muss eine Extension mit Namen XPATH_ANALYZER angelegt werden.
Die Extension hat den folgenden Aufbau:
FORMAT_TYPES=<FORMAT_TYPE>;<FORMAT_TYPE2>;…
<FORMAT_TYPE>.pattern=<Regulärer Ausdruck der das Nachrichtenformat erkennt>
<FORMAT_TYPE>.xpaths=<xpathName1,xpathName2,...xpathNamen>
<FORMAT_TYPE>.xpathName1=<Feld Name vom Format Object>=<XPath Asdruck>
<FORMAT_TYPE2>.pattern=<Regulärer Ausdruck der das Nachrichtenformat erkennt>
<FORMAT_TYPE2>.xpaths=<xpathName1,xpathName2,...xpathNamen>
<FORMAT_TYPE2>.xpathName1=<Feld Name vom Format Object>=<XPath Asdruck>
Der Name für <FORMAT_TYPE> kann frei gewählt werden.
Die Formaterkennung geht die angegebenen Formate der Reihe nach durch
und prüft, ob der reguläre Ausdruck einen Treffer hat. Falls ja, werden
alle unter xpaths
angegebenen XPath-Ausdrücke ausgewertet und dem
entsprechenden Feld des Formatobjektes zugewiesen. Die Suche nach einem
passenden Format wird nach dem ersten Treffer beendet.
Beispiel Extension:
FORMAT_TYPES=ACK;EBIX;IDOC
ACK.pattern=(.*?)(AcknowledgementOfAcceptance_11|ModelErrorReport_11)
ACK.xpaths=SENDER;RECEIVER;REFERENCENUMBER;FORMATIN;TYPE;VERSION
ACK.SENDER=sender=/*/*/Sender/ID/EICID/text()
ACK.RECEIVER=partner=/*/*/Receiver/ID/EICID/text()
ACK.REFERENCENUMBER=referenceId=/*/InstanceDocumentReference/DocumentID/text()
ACK.FORMATIN=presentation="EBIX-XML"
ACK.TYPE=type=substring(substring(local-name(*),1,string-length(local-name(*))-2),1,20)
ACK.VERSION=version=substring(local-name(*),string-length(local-name(*))-1,string-length(local-name(*))-1)
EBIX.pattern=(?s)(.*?)schemaLocation="http://www.strom.ch
EBIX.xpaths=SENDER;RECEIVER;REFERENCENUMBER;FORMATIN;TYPE;VERSION
EBIX.SENDER=sender=/*/*/Sender/ID/EICID/text()
EBIX.RECEIVER=partner=/*/*/Receiver/ID/EICID/text()
EBIX.REFERENCENUMBER=referenceId=/*/*/InstanceDocument/DocumentID/text()
EBIX.FORMATIN=presentation="EBIX-XML"
EBIX.TYPE=type=substring(substring(local-name(*),1,string-length(local-name(*))-2),1,20)
EBIX.VERSION=version=substring(local-name(*),string-length(local-name(*))-1,string-length(local-name(*))-1)
IDOC.PATTERN=(.*?)ISU_VDEW_MSCONS
IDOC.xpaths=SENDER;RECEIVER;REFERENCENUMBER;FORMATIN;TYPE;VERSION
IDOC.SENDER=sender=/ISU_VDEW_MSCONS/IDOC/E1VDEWNAD[ACTION/text()='MS']/PARTNER/text()
IDOC.RECEIVER=partner=/ISU_VDEW_MSCONS/IDOC/E1VDEWNAD[ACTION/text()='MR']/PARTNER/text()
IDOC.REFERENCENUMBER=referenceId=/ISU_VDEW_MSCONS/IDOC/EDI_DC40/DOCNUM/text()
IDOC.FORMATIN=presentation="IDOC"
IDOC.TYPE=type=VDEW_MSCONS
IDOC.VERSION=version=1.6
Zusammenspiel mit der Extension DIALECT
Die Formaterkennung der XMLs wird zuerst mit der Konfiguration in der Extension DIALECT
durchgeführt. Wenn dort kein passender Xml-Dialekt gefunden wurde, können andere Formatanalyzer (wie XPathAnalyzer) hinzugezogen werden.
Was kann man machen, wenn DIALECT ein Format erkennt, dass eigentlich von XPathAnalyzer verarbeitet werden sollte? Zum Beispiel man möchte einen einzelnen Idoc-Untertyp “PEXR2002” vom XPathAnalyzer erkennen lassen. Da aber Idocs allgemein anhand der Extension DIALECT erkannt werden, springt XPathAnalyzer nicht an. Diesen Fall kann man so umgehen:
In DIALECT wird PEXR2002 als ein XML-Dialect definiert. Er muss von der Reihenfolge her nach IDOCXML stehen:
xml.dialect=IDOCXML,PEXR2002
xml.dialect.IDOCXML.id=<EDI_DC40 SEGMENT=\"1\">
xml.dialect.PEXR2002.id=<IDOCTYP>PEXR2002</IDOCTYP>
Die Xml wird dabei sowohl als IDOCXML als auch als PEXR2002 erkannt. Der letzte erkannte Wert “gewinnt”, die Xml wird somit als PEXR2002 anerkannt.
Für PEXR2002 darf in DIALECT keine weitere Einstellung gemacht werden, also z.B. kein xml.PEXR2002.type=...
In diesem Fall werden andere Formatanalyzer ausprobiert, also z.B. der XPathAnalyzer. Wenn dort PEXR2002 korrekt konfiguriert ist, wird die Formaterkennung darüber klappen.