Xpath приводит к пустой переменной - PullRequest
1 голос
/ 08 мая 2020

Меня очень сбивает с толку посредник свойств в наборе интеграторов WSO2 Micro. Есть поле, которое мне нужно извлечь с помощью Xpath, а затем отправить в AWS SQS. Ниже приведен документ, из которого я пытаюсь извлечь поле (обратите внимание, что я обрезал нижнюю половину документа).

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <Waybill
            xmlns="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2"
            xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
            xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
            xmlns:eba="http://ns.tln.nl/eba/schemas/1-0/"
            xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2 http://docs.oasis-open.org/ubl/prd1-UBL-2.1/xsd/maindoc/UBL-Waybill-2.1.xsd http://ns.tln.nl/eba/schemas/1-0-1/EBA-Extensions.xsd">
            <ext:UBLExtensions>
                <ext:UBLExtension>
                    <ext:ExtensionContent>
                        <eba:ReplyAddress>
                            <eba:Webservice>
                                <eba:WebserviceEndPoint>http://www.google.com
                                </eba:WebserviceEndPoint>
                                <eba:Username>123</eba:Username>
                                <eba:Password>123
                                </eba:Password>
                            </eba:Webservice>
                        </eba:ReplyAddress>
                    </ext:ExtensionContent>
                </ext:UBLExtension>
                <ext:UBLExtension>
                    <ext:ExtensionContent>
                        <eba:ReplyAddress>
                            <eba:EmailAddress>some@address.com</eba:EmailAddress>
                        </eba:ReplyAddress>
                    </ext:ExtensionContent>
                </ext:UBLExtension>
            </ext:UBLExtensions>

Я ищу, чтобы проанализировать часть «накладной». Независимо от того, что я пробую со свойством, результатом будет либо ошибка (синтаксическая), либо пустой результат.

Примеры неработающего кода, которые я пробовал до сих пор:

<property expression="//s:Body/Waybill" name="wayb" scope="default" type="STRING" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />

<property expression="$:Body/Waybill" name="messageBody" scope="default" type="STRING" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:eba="http://ns.tln.nl/eba/schemas/1-0/" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2 http://docs.oasis-open.org/ubl/prd1-UBL-2.1/xsd/maindoc/UBL-Waybill-2.1.xsd http://ns.tln.nl/eba/schemas/1-0-1/EBA-Extensions.xsd"/>

<property expression="//Waybill" name="messageBody" scope="default" type="STRING" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:eba="http://ns.tln.nl/eba/schemas/1-0/" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Waybill-2 http://docs.oasis-open.org/ubl/prd1-UBL-2.1/xsd/maindoc/UBL-Waybill-2.1.xsd http://ns.tln.nl/eba/schemas/1-0-1/EBA-Extensions.xsd"/>

<property expression="//Waybill" name="messageBody" scope="default" type="STRING" />

Обратите внимание, что я могу легко захватить поле body, которое ДЕЙСТВИТЕЛЬНО работает:

<property expression="$body" name="messageBody" scope="default" type="STRING"/>

Что мне здесь не хватает?

1 Ответ

1 голос
/ 19 мая 2020

Проблема здесь (как и в случае со многими xml сниппетами) заключается в использовании пространств имен; как вам скажут эксперты, они необходимы - но, на мой взгляд, неизбежное зло ....

Один из способов справиться с ними - это игнорировать их, когда это возможно; это, в свою очередь, можно сделать с помощью функции xpath local-name().

Или, в данном случае:

//*[local-name()='Waybill']
...