У меня есть поток сообщений в IIB, который преобразует структуру XML в плоский файл (DFDL). У меня странное требование к обработке исключений.
При преобразовании, если любое поле XML вызывает исключение (скажем, исключение преобразования), я должен создать отчет XML, в котором будет указан XPath поля, вызывающего проблему. Сгенерированный ExceptionList не имеет XPath (в большинстве случаев).
Как я могу реализовать это без ущерба для производительности?
Я пробовал два метода :
1) Сгенерировать XPath для полной XML полезной нагрузки и сравнить значение
Предположим, у меня есть XML, как показано ниже, и EmployerAddress (имеющий значение 'XYZ') вызвали проблему
<ns:Company xmlns:ns="https://company">
<Employer>
<EmployerName>XYZ</EmployerName> /ns:Company[1]/Employer[1]/EmployerName[1]='XYZ'
<EmployerAddress>XYZ</EmployerAddress> /ns:Company[1]/Employer[1]/EmployerAddress[1]='XYZ'
<Employee>
<EmployeeName>ABC</EmployeeName> /ns:Company[1]/Employer[1]/Employee[1]/EmployeeName[1]='ABC'
<Department>ABC</Department> /ns:Company[1]/Employer[1]/Employee[1]/Department[1]='ABC'
</Employee>
</Employer>
</ns:Company>
ExceptionList содержит Insert-Texts, значение которого (в большинстве случаев) вызвало ошибку. Объедините XYZ как = 'XYZ' и выполните поиск по всему списку сгенерированных XPath.
Однако этот лог c имеет проблему, поскольку = 'XYZ' был также значение EmployerName , поиск вернет мне более 1 XPath, из которых верным будет только 1.
2) Сохранение контрольных точек перед каждым E SQL Statement
Сохраните XPath как CheckPoints в Дереве окружающей среды перед выполнением любого оператора. После успешного выполнения оператора переопределите контрольную точку следующим элементом, включенным в оператор E SQL.
Это работает, однако это не очень хороший способ написать код plus memory и время потребления максимально.
Любые предложения / псевдо / код очень помогут. Заранее спасибо!
ОБНОВЛЕНИЕ
Добавление полного ExceptionList
ExceptionList
RecoverableException
File:CHARACTER:F:\build\slot3\S1000_P\src\DataFlowEngine\MessageServices\ImbDataFlowNode.cpp
Line:INTEGER:1250
Function:CHARACTER:ImbDataFlowNode::createExceptionList
Type:CHARACTER:ComIbmWSInputNode
Name:CHARACTER:getXPaths#FCMComposite_1_1
Label:CHARACTER:getXPaths.HTTP Input
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2230
Text:CHARACTER:Node throwing exception
Insert
Type:INTEGER:14
Text:CHARACTER:getXPaths.HTTP Input
RecoverableException
File:CHARACTER:F:\build\slot3\S1000_P\src\DataFlowEngine\PluginInterface\ImbJniNode.cpp
Line:INTEGER:1269
Function:CHARACTER:ImbJniNode::evaluate
Type:CHARACTER:ComIbmXslMqsiNode
Name:CHARACTER:getXPaths#FCMComposite_1_5
Label:CHARACTER:getXPaths.XSL Transform
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2230
Text:CHARACTER:Caught exception and rethrowing
Insert
Type:INTEGER:14
Text:CHARACTER:getXPaths.XSL Transform
RecoverableException
File:CHARACTER:F:\build\slot3\S1000_P\src\DataFlowEngine\SQLNodeLibrary\ImbComputeNode.cpp
Line:INTEGER:515
Function:CHARACTER:ImbComputeNode::evaluate
Type:CHARACTER:ComIbmComputeNode
Name:CHARACTER:getXPaths#FCMComposite_1_4
Label:CHARACTER:getXPaths.createError
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2230
Text:CHARACTER:Caught exception and rethrowing
Insert
Type:INTEGER:14
Text:CHARACTER:getXPaths.createError
RecoverableException
File:CHARACTER:F:\build\slot3\S1000_P\src\DataFlowEngine\ImbRdl\ImbRdlStatementGroup.cpp
Line:INTEGER:792
Function:CHARACTER:SqlStatementGroup::execute
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2488
Text:CHARACTER:Error detected, rethrowing
Insert
Type:INTEGER:5
Text:CHARACTER:.createError.Main
Insert
Type:INTEGER:5
Text:CHARACTER:13.3
Insert
Type:INTEGER:5
Text:CHARACTER:SET OutputRoot.XMLNSC.Output.Casting = CAST(InputRoot.XMLNSC.*:*.Employer.EmployerAddress AS INTEGER);
RecoverableException
File:CHARACTER:F:\build\slot3\S1000_P\src\DataFlowEngine\ImbRdl\ImbRdlTypeCast.cpp
Line:INTEGER:342
Function:CHARACTER:SqlTypeCast::evaluate
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2521
Text:CHARACTER:Error casting from %3 to %4
Insert
Type:INTEGER:5
Text:CHARACTER:.createError.Main
Insert
Type:INTEGER:5
Text:CHARACTER:13.42
Insert
Type:INTEGER:5
Text:CHARACTER:'XYZ'
Insert
Type:INTEGER:5
Text:CHARACTER:INTEGER
ConversionException
File:CHARACTER:F:\build\slot3\S1000_P\src\CommonServices\ImbUtility.cpp
Line:INTEGER:441
Function:CHARACTER:imbWcsToInt64
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2595
Text:CHARACTER:Invalid characters
Insert
Type:INTEGER:2
Text:CHARACTER:-1
Insert
Type:INTEGER:5
Text:CHARACTER:S22018
Insert
Type:INTEGER:5
Text:CHARACTER:XYZ
Это мой метод обработки ошибок, сгенерированный в Дереве среды
ErrorDetails
Error
Exact
ErrorCode:INTEGER:2595
ExceptionType:CHARACTER:ConversionException
ErrorSeverity:CHARACTER:Error
ErrorDescription:CHARACTER:Error casting character string 'XYZ' to an integer. State = '-1' 'S22018' '0' ''.
ErrorExplanation:CHARACTER:An attempt was made to cast the character string 'XYZ' to an integer, but the string was of the wrong format.
ErrorResponse:CHARACTER:Other messages will give an indication of context of this error.
Parent
ErrorCode:INTEGER:2521
ExceptionType:CHARACTER:RecoverableException
ErrorSeverity:CHARACTER:Error
ErrorDescription:CHARACTER:(.createError.Main, 13.42) : Error casting the value ''XYZ'' to 'INTEGER'.
ErrorExplanation:CHARACTER:An error occurred when casting a value to a different data type. This may be because no conversions exist between the two data types or because the particular value was unsuitable.
ErrorResponse:CHARACTER:Subsequent messages will indicate the context of the error.
Используя logi c (1) , я получаю ответ как
<Output>
<CompleteXPath>/ns:Company[1]/Employer[1]/EmployerName[1]|/ns:Company[1]/Employer[1]/EmployerAddress[1]</CompleteXPath>
<FieldName>EmployerName|EmployerAddress</FieldName>
<FieldValue>XYZ|XYZ</FieldValue>
</Output>