Как именно работает этот итерационный посредник в этом проекте ESB WSO2?

Я абсолютно новичок в WSO2, и у меня есть следующие сомнения относительно проекта ESB, над которым я работаю.

Я должен повторять каждый <Sample>...</Sample> элемент следующего XML- документа (поступающего из службы DSS):

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <Samples xmlns="http://ws.wso2.org/dataservice">
            <Sample>
                <sample_id>XXX00001</sample_id>
                <processed>n</processed><sample_doi>sampleid001</sample_doi><date>2000-01-01</date><hold_wiews>hold_wiews-0001</hold_wiews><hold_pid>hold_pid-001</hold_pid><hold_name>hold_name-001</hold_name><hold_address>hold_address-001</hold_address><hold_country>001</hold_country><hold_lat>hold_lat-1</hold_lat><hold_lon>hold_lon-1</hold_lon><method>acqu</method><genus>genus-001</genus><species>species-001</species><sp_auth>sp_auth-001</sp_auth><subtaxa>subtaxa-001</subtaxa><st_auth>st_auth-001</st_auth><bio_status>001</bio_status><mls_status>01</mls_status><prov_sid>prov_sid-001</prov_sid><provenance>pr1</provenance><coll_sid>coll_sid-001</coll_sid><coll_miss_id>coll_miss_id-001</coll_miss_id><coll_site>coll_site-001</coll_site><coll_lat>coll_lat-1</coll_lat><coll_lon>coll_lon-1</coll_lon><coll_uncert>coll_uncert-001</coll_uncert><coll_datum>coll_datum-001</coll_datum><coll_georef>coll_georef-001</coll_georef><coll_elevation>1</coll_elevation><coll_date>2001-01-01</coll_date><coll_source>s1</coll_source><ancestry>ancestry-001</ancestry>
            </Sample>

            <Sample>
                <sample_id>XXX00002</sample_id>
                <processed>n</processed><sample_doi>sampleid002</sample_doi><date>2000-01-02</date><hold_wiews>hold_wiews-0002</hold_wiews><hold_pid>hold_pid-002</hold_pid><hold_name>hold_name-002</hold_name><hold_address>hold_address-002</hold_address><hold_country>002</hold_country><hold_lat>hold_lat-2</hold_lat><hold_lon>hold_lon-2</hold_lon><method>acqu</method><genus>genus-002</genus><species>species-002</species><sp_auth>sp_auth-002</sp_auth><subtaxa>subtaxa-002</subtaxa><st_auth>st_auth-002</st_auth><bio_status>002</bio_status><mls_status>02</mls_status><prov_sid>prov_sid-002</prov_sid><provenance>pr2</provenance><coll_sid>coll_sid-002</coll_sid><coll_miss_id>coll_miss_id-002</coll_miss_id><coll_site>coll_site-002</coll_site><coll_lat>coll_lat-2</coll_lat><coll_lon>coll_lon-2</coll_lon><coll_uncert>coll_uncert-002</coll_uncert><coll_datum>coll_datum-002</coll_datum><coll_georef>coll_georef-002</coll_georef><coll_elevation>2</coll_elevation><coll_date>2001-01-02</coll_date><coll_source>s2</coll_source><ancestry>ancestry-002</ancestry>
            </Sample>

            <Sample>
                <sample_id>XXX00003</sample_id>
                <processed>n</processed><sample_doi>sampleid003</sample_doi><date>2000-01-03</date><hold_wiews>hold_wiews-0003</hold_wiews><hold_pid>hold_pid-003</hold_pid><hold_name>hold_name-003</hold_name><hold_address>hold_address-003</hold_address><hold_country>003</hold_country><hold_lat>hold_lat-3</hold_lat><hold_lon>hold_lon-3</hold_lon><method>acqu</method><genus>genus-003</genus><species>species-003</species><sp_auth>sp_auth-003</sp_auth><subtaxa>subtaxa-003</subtaxa><st_auth>st_auth-003</st_auth><bio_status>003</bio_status><mls_status>03</mls_status><prov_sid>prov_sid-003</prov_sid><provenance>pr3</provenance><coll_sid>coll_sid-003</coll_sid><coll_miss_id>coll_miss_id-003</coll_miss_id><coll_site>coll_site-003</coll_site><coll_lat>coll_lat-3</coll_lat><coll_lon>coll_lon-3</coll_lon><coll_uncert>coll_uncert-003</coll_uncert><coll_datum>coll_datum-003</coll_datum><coll_georef>coll_georef-003</coll_georef><coll_elevation>3</coll_elevation><coll_date>2001-01-03</coll_date><coll_source>s3</coll_source><ancestry>ancestry-003</ancestry>
            </Sample>
        </Samples>
    </soapenv:Body>
</soapenv:Envelope>

Для этого я использую посредник итерации (он работает довольно хорошо), что-то вроде этого:

<iterate expression="$body//ds:Sample" id="ITR_AGG" xmlns:ds="http://ws.wso2.org/dataservice">
    <target>
        <sequence>
            <enrich>
                <source clone="true" type="envelope"/>
                <target property="sampleData" type="property"/>
            </enrich>

            <!-- Log Sample Data -->
            <log level="custom">
                <property expression="$ctx:sampleData" name="sample data"/>
            </log>

            ...........................................................
            ...........................................................
            DO SOME OTHER STUFF
            ...........................................................
            ...........................................................
        </sequence>
    </target>
</iterate>

Это работает нормально, но у меня есть некоторые сомнения, я пытаюсь объяснить эти сомнения.

Посредник итерации реализует шаблон интеграции Splitter Enterprise **, он используется для разделения сообщения на ряд различных сообщений, полученных из родительского сообщения **.

Итак, я разделяю исходное сообщение, которое в основном содержится в <soapenv:Body>---</soapenv:Body> контейнер в 3 <Sample>...</Sample> отдельное сообщение

Это работает, но почему выражение итерации определено в посреднике итератора:

<iterate expression="$body//ds:Sample" id="ITR_AGG" xmlns:ds="http://ws.wso2.org/dataservice">

такое $body // ds: Sample?

Итак, я думаю, что я должен использовать префикс ds: потому что он исходит от службы данных (скажите мне, если я делаю неправильное утверждение). Но что именно представляет переменную $body? (это что-то вроде переменной?)

Это представляет <soapenv:Body> элемент, в котором нужно искать <Sample> элемент, который должен быть повторен? Или что? Если мое предположение верно, то как <soapenv:Body> связан с переменной $body?

Второе сомнение связано с использованием посредника обогащения, содержащегося в начале повторного посредника:

<enrich>
    <source clone="true" type="envelope"/>
    <target property="sampleData" type="property"/>
</enrich>

Что именно делает? Мне кажется, что он копирует текущий элемент, который выполняет итерацию, в новое свойство с именем sampleData, после этого посредник записывает в журнал свойство sampleData, которое печатается примерно так:

sample data = 
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <Sample xmlns="http://ws.wso2.org/dataservice">
            <sample_id>XXX00001</sample_id>
            <processed>n</processed><sample_doi>sampleid001</sample_doi><date>2000-01-01</date><hold_wiews>hold_wiews-0001</hold_wiews><hold_pid>hold_pid-001</hold_pid><hold_name>hold_name-001</hold_name><hold_address>hold_address-001</hold_address><hold_country>001</hold_country><hold_lat>hold_lat-1</hold_lat><hold_lon>hold_lon-1</hold_lon><method>acqu</method><genus>genus-001</genus><species>species-001</species><sp_auth>sp_auth-001</sp_auth><subtaxa>subtaxa-001</subtaxa><st_auth>st_auth-001</st_auth><bio_status>001</bio_status><mls_status>01</mls_status><prov_sid>prov_sid-001</prov_sid><provenance>pr1</provenance><coll_sid>coll_sid-001</coll_sid><coll_miss_id>coll_miss_id-001</coll_miss_id><coll_site>coll_site-001</coll_site><coll_lat>coll_lat-1</coll_lat><coll_lon>coll_lon-1</coll_lon><coll_uncert>coll_uncert-001</coll_uncert><coll_datum>coll_datum-001</coll_datum><coll_georef>coll_georef-001</coll_georef><coll_elevation>1</coll_elevation><coll_date>2001-01-01</coll_date><coll_source>s1</coll_source><ancestry>ancestry-001</ancestry>
        </Sample>
    </soapenv:Body>
</soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator}

это представляет текущий элемент, на котором я итерации. Правильно ли мое рассуждение?

1 ответ

Решение

Вы можете использовать любую строку для префикса, просто обязательно используйте ту же строку после xmlns:

xmlns:ds="http://ws.wso2.org/dataservice"

Пример:

<iterate expression="$body//mypref:Sample" id="ITR_AGG" xmlns:mypref="http://ws.wso2.org/dataservice">

$body - это предопределенное выражение xpath для синапса, которое представляет сообщение тела:

https://docs.wso2.com/display/ESB500/Synapse+XPath+Variables$body

Обогащенный посредник:

<enrich>
    <source clone="true" type="envelope"/>
    <target property="sampleData" type="property"/>
</enrich>

Просто скопируйте содержимое входящего сообщения, всю полезную нагрузку, включая soapevelop, в свойство с именем sampleData.

Другие вопросы по тегам