Получите XPath для XML Значение поля, которое вызвало ошибку преобразования в IIB - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть поток сообщений в 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>

1 Ответ

1 голос
/ 13 апреля 2020

При преобразовании, если любое поле XML вызывает исключение (скажем, исключение преобразования), я должен создать отчет XML, в котором будет указан XPath поля, вызывающего проблему.

Это техническое требование, и (как вы выяснили) его может быть сложно / дорого реализовать. Кому нужен этот XML отчет, и что они хотят с ним делать?

Мое предложение, основанное на лоте опыта в этой области:

  • Выполните максимально возможную проверку с использованием XMLNS C и XML Схема. Ваш пример «XYZ не является целым числом» может быть легко пойман, если в XSD объявить элемент как xs: int (или некоторый другой тип целого числа). Анализатор XMLNS C всегда предоставляет путь к элементу, когда сообщает об ошибке проверки. Прекратите писать E SQL для вещей, которые XMLNS C может сделать для вас!
  • Не пытайтесь проверять все . Настаивайте на том, чтобы бизнес-пользователи (или те, кто запрашивает эту функцию) предоставили вам список того, что им нужно. Напишите код только для проверки этих вещей.
  • При необходимости используйте анализатор DFDL для обнаружения ошибок. Опять же, синтаксический анализатор DFDL почти всегда будет включать путь к полю проблемы, когда он сообщает об ошибке.
  • Объясните бизнес-пользователям (или тем, кто запрашивает эту функцию), что выполнение чего-либо большего, чем это, потребует специального кода, который будет дорогостоящим и трудоемким для реализации, трудным для реализации и сложным в обслуживании.

Может потребоваться написать собственный код для извлечения XPath из различных типов сообщений XMLNS C и DFDL. Это может быть неудобно, но, по крайней мере, его легко поместить в общую библиотеку.

...