Как проанализировать ответ SOAP с внутренними ссылками, используя XPath в Java - PullRequest
2 голосов
/ 27 января 2012

Я хочу проанализировать сообщение SOAP с XPath, но в ответе XML есть внутренние ссылки.XPath не разрешает их.Можно ли автоматически разрешать ссылки перед использованием XPath, чтобы я мог использовать выражения xpath, такие как "// get_referencesResponse / Result / source / item" или есть лучший способ прочитать документ?

<SOAP-ENV:Body>
    <get_referencesResponse SOAP-ENC:root="1" id="i1">
        <Result href="#i2"/>
    </get_referencesResponse>
    <Result SOAP-ENC:root="0" id="i2">
        <source href="#i3"/>
        <malware href="#i4"/>
        [...]
    </Result>
    <source SOAP-ENC:arrayType="xsd:string[2]" SOAP-ENC:root="0" id="i3" xsi:type="SOAP-    ENC:Array">
        <item href="#i8"/>
        <item href="#i9"/>
    </source>
    <malware SOAP-ENC:arrayType="xsd:string[7]" SOAP-ENC:root="0" id="i4" xsi:type="SOAP-ENC:Array">
        <item href="#i10"/>
        <item href="#i11"/>
        <item href="#i12"/>
        [...]
    </malware>
    [...]

    <item SOAP-ENC:root="0" id="i8" xsi:type="xsd:string">address</item>
    <item SOAP-ENC:root="0" id="i9" xsi:type="xsd:string">network_prefix</item>
    <item SOAP-ENC:root="0" id="i10" xsi:type="xsd:string">md5</item>
    [...]

    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

1 Ответ

0 голосов
/ 27 января 2012

Можно ли автоматически разрешать ссылки перед использованием XPath, чтобы что я мог бы использовать выражения XPath, как "//get_referencesResponse/Result/source/item" или есть лучше способ прочитать документ?

Используйте

/*/item[@id = substring(/*/Result/source/@href, 2)]

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[@id = substring(/*/Result/source/@href, 2)]"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML (ваш, но сделан правильно и добавлено item с id=3):

<SOAP-ENV:Body
 xmlns:SOAP-ENV="some:SOAP-ENV"
 xmlns:SOAP-ENC="some:SOAP-ENC"
 xmlns:xsi="some:xsi">
    <get_referencesResponse SOAP-ENC:root="1" id="i1">
        <Result href="#i2"/>
    </get_referencesResponse>
    <Result SOAP-ENC:root="0" id="i2">
        <source href="#i3"/>
        <malware href="#i4"/>         [...]     
    </Result>
    <source SOAP-ENC:arrayType="xsd:string[2]"
    SOAP-ENC:root="0" id="i3" xsi:type="SOAP-ENC:Array">
        <item href="#i8"/>
        <item href="#i9"/>
    </source>
    <malware SOAP-ENC:arrayType="xsd:string[7]"
    SOAP-ENC:root="0" id="i4" xsi:type="SOAP-ENC:Array">
        <item href="#i10"/>
        <item href="#i11"/>
        <item href="#i12"/>         [...]     
    </malware>     [...]      
    <item SOAP-ENC:root="0" id="i3"
    xsi:type="xsd:string">name</item>
    <item SOAP-ENC:root="0" id="i8"
    xsi:type="xsd:string">address</item>
    <item SOAP-ENC:root="0" id="i9"
    xsi:type="xsd:string">network_prefix</item>
    <item SOAP-ENC:root="0" id="i10" x
    si:type="xsd:string">md5</item>     [...]      
</SOAP-ENV:Body>

вычисляется выражение Xpath и выводится выбранный элемент :

<item xmlns:SOAP-ENV="some:SOAP-ENV"
 xmlns:SOAP-ENC="some:SOAP-ENC"
 xmlns:xsi="some:xsi"
 SOAP-ENC:root="0" id="i3" xsi:type="xsd:string">name</item>
...