У меня возникли проблемы с анализом XML в IDOC с использованием библиотеки SAP JCo. Я знаю, что мне нужно соединение с системой SAP, которое дано.
Вот мой код теста Gradle:
when:
JCoIDocServer server = JCoIDoc.getServer(sapProperties.get("jco.server.progid"))
IDocXMLProcessor xmlProcessor = JCoIDoc.getIDocFactory().getIDocXMLProcessor()
IDocDocumentList iDocDocumentList = xmlProcessor.parse(server.getIDocRepository(), getClass().getResourceAsStream("/data/DEBMAS-406868135.XML"), IDocXMLProcessor.PARSE_IGNORE_UNKNOWN_FIELDS)
Соединение работает, но JCo обнаруживает несоответствие в моем XML (экспортированном из SAP, без изменений вручную!), Которое, по-видимому, вызвано полями расширения SAP:
com.sap.conn.idoc.IDocParseException: (7) IDOC_ERROR_PARSE_FAILURE: IDoc type extension ZDEBMAS3 within the EDI_DC40 control record segment does not match the IDoc-XML root tag <DEBMAS05>:
state = READING_ENDTAG, charPosition = 852, lineNumber = 24, columnNumber = 19
Как видите, я пытался использовать параметры парсера XML, которые не помогли.
Что мне нужно сделать, чтобы поля расширения были приняты IDocParser?
Обновление 1
Здесь вы можете найти анонимный IDOC XML.
<?xml version="1.0"?>
<DEBMAS05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM><![CDATA[EDI_DC40]]></TABNAM>
<MANDT>100</MANDT>
<DOCNUM>0000000406868135</DOCNUM>
<DOCREL>750</DOCREL>
<STATUS>12</STATUS>
<DIRECT>1</DIRECT>
<OUTMOD>2</OUTMOD>
<IDOCTYP>DEBMAS05</IDOCTYP>
<CIMTYP>ZDEBMAS3</CIMTYP>
<MESTYP><![CDATA[Z_DEBMAS2]]></MESTYP>
<SNDPOR>XXX</SNDPOR>
<SNDPRT>LS</SNDPRT>
<SNDPRN><![CDATA[P02_100]]></SNDPRN>
<RCVPOR>INTERNET</RCVPOR>
<RCVPRT>LS</RCVPRT>
<RCVPRN>INTERNET</RCVPRN>
<CREDAT>20190503</CREDAT>
<CRETIM>085059</CRETIM>
<SERIAL>20190503081911</SERIAL>
</EDI_DC40>
<E1KNA1M SEGMENT="1">
<MSGFN>004</MSGFN>
<KUNNR>XXX</KUNNR>
<ANRED>XXX</ANRED>
<BBBNR>0000000</BBBNR>
<BBSNR>00000</BBSNR>
<BUBKZ>0</BUBKZ>
<KTOKD>XXX</KTOKD>
<LAND1>XX</LAND1>
<NAME1>XXX</NAME1>
<ORT01>XXX</ORT01>
<ORT02>XXX</ORT02>
<PSTLZ>XXX</PSTLZ>
<REGIO>XXX</REGIO>
<SORTL>XXX</SORTL>
<SPRAS>XXX</SPRAS>
<STRAS>XXX</STRAS>
<LZONE>0000000001</LZONE>
<UMJAH>0000</UMJAH>
<JMZAH>000000</JMZAH>
<JMJAH>0000</JMJAH>
<KATR3>XXX</KATR3>
<KATR7>XXX</KATR7>
<KATR8>XXX</KATR8>
<STKZN>X</STKZN>
<UMSA1>0</UMSA1>
<HZUOR>00</HZUOR>
<CIVVE>X</CIVVE>
<SPRAS_ISO>DE</SPRAS_ISO>
<ZE1BPAD SEGMENT="1">
<PARNR>XXX</PARNR>
<TITLE_P>XXX</TITLE_P>
<FIRSTNAME>XXX</FIRSTNAME>
<LASTNAME>XXX</LASTNAME>
<SORT1_P>XXX</SORT1_P>
<NAMCOUNTRY>DE</NAMCOUNTRY>
<NAMCTRYISO>DE</NAMCTRYISO>
<LANGU_P>D</LANGU_P>
<LANGUP_ISO>DE</LANGUP_ISO>
<C_O_NAME>XXX</C_O_NAME>
<DISTRICT>XXX</DISTRICT>
<CITY>XXX</CITY>
<POSTL_COD1>XXX</POSTL_COD1>
<REGION>XXX</REGION>
<TRANSPZONE>0000000001</TRANSPZONE>
<STREET>XXX.</STREET>
<HOUSE_NO>XXX</HOUSE_NO>
<PERS_GROUP>XXX</PERS_GROUP>
<ADDR_GROUP>XXX</ADDR_GROUP>
<E_MAIL>XXX</E_MAIL>
</ZE1BPAD>
<E1KNA11 SEGMENT="1">
<KNURL>/</KNURL>
<J_1KFREPRE>/</J_1KFREPRE>
<J_1KFTBUS>/</J_1KFTBUS>
<J_1KFTIND>/</J_1KFTIND>
<PSOIS>/</PSOIS>
<PSON1>/</PSON1>
<PSON2>/</PSON2>
<PSON3>/</PSON3>
<PSOVN>/</PSOVN>
<PSOTL>/</PSOTL>
<PSOO1>/</PSOO1>
<PSOO2>/</PSOO2>
<PSOO3>/</PSOO3>
<PSOO4>/</PSOO4>
<PSOO5>/</PSOO5>
<STCD5>/</STCD5>
<SUFRAMA>/</SUFRAMA>
<RG>/</RG>
<EXP>/</EXP>
<UF>/</UF>
<RGDATE>/</RGDATE>
<RIC>/</RIC>
<RNE>/</RNE>
<RNEDATE>/</RNEDATE>
<CNAE>/</CNAE>
<LEGALNAT>/</LEGALNAT>
<CRTN>/</CRTN>
<ICMSTAXPAY>/</ICMSTAXPAY>
<INDTYP>/</INDTYP>
<TDT>/</TDT>
<COMSIZE>/</COMSIZE>
<DECREGPC>/</DECREGPC>
<CVP_XBLCK>/</CVP_XBLCK>
</E1KNA11>
<E1KNVVM SEGMENT="1">
<MSGFN>XXX</MSGFN>
<VKORG>XXX</VKORG>
<VTWEG>XXX</VTWEG>
<SPART>XXX</SPART>
<VERSG>1</VERSG>
<KALKS>XXX</KALKS>
<KONDA>XXX</KONDA>
<AWAHR>XXX</AWAHR>
<INCO1>FH</INCO1>
<INCO2>XXX</INCO2>
<ANTLF>XXX</ANTLF>
<KZTLF>XXX</KZTLF>
<LPRIO>XXX</LPRIO>
<WAERS>XXX</WAERS>
<KTGRD>XXX</KTGRD>
<ZTERM>XXX</ZTERM>
<VWERK>XXX</VWERK>
<KVGR4>XXX</KVGR4>
<KVGR5>XXX</KVGR5>
<UEBTO>XXX</UEBTO>
<UNTTO>XXX</UNTTO>
<PVKSM>XXX</PVKSM>
<PODTG>XXX</PODTG>
<BLIND>/</BLIND>
<CARRIER_NOTIF>/</CARRIER_NOTIF>
<CVP_XBLCK_V>/</CVP_XBLCK_V>
<INCOV>/</INCOV>
<INCO2_L>/</INCO2_L>
<INCO3_L>/</INCO3_L>
<ZE1KNVV SEGMENT="1">
<HASH_CODE>XXX</HASH_CODE>
</ZE1KNVV>
<E1KNVPM SEGMENT="1">
<MSGFN>XXX</MSGFN>
<PARVW>XXX</PARVW>
<KUNN2>XXX</KUNN2>
<PARZA>XXX</PARZA>
</E1KNVPM>
<E1KNVPM SEGMENT="1">
<MSGFN>XXX</MSGFN>
<PARVW>XXX</PARVW>
<KUNN2>XXX</KUNN2>
<PARZA>XXX</PARZA>
</E1KNVPM>
<E1KNVPM SEGMENT="1">
<MSGFN>XXX</MSGFN>
<PARVW>WE</PARVW>
<KUNN2>XXX</KUNN2>
<PARZA>XXX</PARZA>
</E1KNVPM>
</E1KNVVM>
<E1KNB1M SEGMENT="1">
<MSGFN>XXX</MSGFN>
<BUKRS>XXX</BUKRS>
<ZUAWA>XXX</ZUAWA>
<AKONT>XXX</AKONT>
<ZWELS>XXX</ZWELS>
<ZTERM>XXX</ZTERM>
<VZSKZ>XXX</VZSKZ>
<ZINDT>XXX</ZINDT>
<ZINRT>XXX</ZINRT>
<FDGRV>XXX</FDGRV>
<VLIBB>XXX</VLIBB>
<VRSZL>XXX</VRSZL>
<VRSPR>XXX</VRSPR>
<VERDT>XXX</VERDT>
<WEBTR>XXX</WEBTR>
<DATLZ>XXX</DATLZ>
<XZVER>XXX</XZVER>
<KULTG>XXX</KULTG>
<PERNR>XXX</PERNR>
<GMVKZD>/</GMVKZD>
<AVSND>/</AVSND>
<SMTP_ADDR>/</SMTP_ADDR>
<CVP_XBLCK_B>/</CVP_XBLCK_B>
<E1KNB5M SEGMENT="1">
<MSGFN>XXX</MSGFN>
<MAHNA>XXX</MAHNA>
<MADAT>XXX</MADAT>
<MAHNS>XXX</MAHNS>
<GMVDT>XXX</GMVDT>
</E1KNB5M>
<E1KNB5M SEGMENT="1">
<MSGFN>XXX</MSGFN>
<MABER>XXX</MABER>
<MAHNA>XXX</MAHNA>
<MADAT>XXX</MADAT>
<MAHNS>XXX</MAHNS>
<GMVDT>XXX</GMVDT>
</E1KNB5M>
</E1KNB1M>
<E1KNKKM SEGMENT="1">
<MSGFN>XXX</MSGFN>
<KKBER>XXX</KKBER>
<KLIMK>XXX</KLIMK>
<KNKLI>XXX</KNKLI>
<CTLPC>XXX</CTLPC>
<DTREV>XXX</DTREV>
<SBGRP>XXX</SBGRP>
<NXTRV>XXX</NXTRV>
<PAYDB>XXX</PAYDB>
<REVDB>XXX</REVDB>
<SBDAT>XXX</SBDAT>
<DBEKR>XXX</DBEKR>
<DBMON>XXX</DBMON>
</E1KNKKM>
</E1KNA1M>
<EDI_DS40 SEGMENT="1">
<MANDT>XXX</MANDT>
<DOCNUM>XXX</DOCNUM>
<LOGDAT>XXX</LOGDAT>
<LOGTIM>XXX</LOGTIM>
<STATUS>XXX</STATUS>
<STAMNO>XXX</STAMNO>
<UNAME><![CDATA[BTCSD_01]]></UNAME>
<SEGNUM>XXX</SEGNUM>
</EDI_DS40>
<EDI_DS40 SEGMENT="1">
<MANDT>XXX</MANDT>
<DOCNUM>XXX</DOCNUM>
<LOGDAT>XXX</LOGDAT>
<LOGTIM>XXX</LOGTIM>
<STATUS>XXX</STATUS>
<STAMQU>XXX</STAMQU>
<STAMID>XXX</STAMID>
<STAMNO>XXX</STAMNO>
<STATYP>XXX</STATYP>
<STAPA1>XXX</STAPA1>
<STAPA2>XXX</STAPA2>
<STAPA3>XXX</STAPA3>
<STAPA4>XXX</STAPA4>
<STATXT><![CDATA[&, &, &, &.]]></STATXT>
<UNAME><![CDATA[BTCSD_01]]></UNAME>
<SEGNUM>XXX</SEGNUM>
</EDI_DS40>
<EDI_DS40 SEGMENT="1">
<MANDT>XXX</MANDT>
<DOCNUM>XXX</DOCNUM>
<LOGDAT>XXX</LOGDAT>
<LOGTIM>XXX</LOGTIM>
<STATUS>XXX</STATUS>
<STAMQU>XXX</STAMQU>
<STAMID>XXX</STAMID>
<STAMNO>XXX</STAMNO>
<STAPA1><![CDATA[SAP_ALE_Z_DEBMAS2]]></STAPA1>
<STAPA2>XXX</STAPA2>
<STATXT>XXX</STATXT>
<UNAME><![CDATA[BTCSD_01]]></UNAME>
<REPID>XXX</REPID>
<SEGNUM>XXX</SEGNUM>
</EDI_DS40>
<EDI_DS40 SEGMENT="1">
<MANDT>XXX</MANDT>
<DOCNUM>XXX</DOCNUM>
<LOGDAT>XXX</LOGDAT>
<LOGTIM>XXX</LOGTIM>
<STATUS>XXX</STATUS>
<STAMNO>XXX</STAMNO>
<UNAME><![CDATA[BTCSD_01]]></UNAME>
<REPID>RBDMOIND</REPID>
<SEGNUM>XXX</SEGNUM>
</EDI_DS40>
</IDOC>
Обновление 2
Просто для тестирования я попытался создать IDOC вручную со следующим фрагментом кода
JCoIDocServer server = JCoIDoc.getServer(sapProperties.get("jco.server.progid"))
IDocDocument idoc = JCoIDoc.getIDocFactory().createIDocDocument(server.getIDocRepository(), "DEBMAS05")
idoc.setValue("MANDT", 100)
idoc.setValue("IDOCTYP", "DEBMAS05")
idoc.setValue("CIMTYP", "ZDEBMAS3")
idoc.setIDocNumber("0000000406868135")
JCoIDocSegment segment = idoc.rootSegment.addChild("E1KNA1M")
segment.addChild("ZE1BPAD")
Это приводит к той же ошибке, что и при использовании xmlProcessor.
Но если я изменю это местоположение, добавив тип расширения IDOC
IDocDocument idoc = JCoIDoc.getIDocFactory().createIDocDocument(server.getIDocRepository(), "DEBMAS05","ZDEBMAS3")
ошибка исчезает.
Обновление 3
Кажется, я перепутал две проблемы. Первое происходит, когда JCo анализирует XML, вызывая исключение, описанное здесь.
В JCo 3.0.17 вызывающая реализация находится в DefaultIDocXMLParser в строке 1321
if (cimType.length() > 0 && !cimType.equals(this.openTags.getFirst()) || cimType.length() == 0 && !iDocType.equals(this.openTags.getFirst())) {
throw new IDocParseException("IDoc type " + (cimType.length() > 0 ? "extension " + cimType : iDocType) + " within the EDI_DC40 control record segment does not match the IDoc-XML root tag <" + (String)this.openTags.getFirst() + ">", this.state.name(), this.charPosition, this.lineNumber, this.columnNumber, (String)null, 0);
}
Чтобы избежать этого исключения, можно удалить элемент, который вызывает то же исключение, что и программно созданный IDOC без типа расширения.
Теперь вопрос: как настроить XMLParser для приема расширений?