2012-01-27 13 views
2

XPathでSOAPメッセージを解析するが、XML応答では内部参照を使用したいと思う。 XPathでこれらが解決されません。 XPathを使用する前に自動的に参照を解決して、 "// get_referencesResponse/Result/source/item"のようなxp​​ath式を使用することが可能ですか?それとも、文書を読む良い方法はありますか?JavaでXPathを使用して内部参照を使用してSOAP応答を解析する方法

<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> 

答えて

0

それはそうXPathを使用する前に、私は 「//get_referencesResponse/Result/source/item」のようなXPath式を使用することができたり、ドキュメントを読むために、より良い 方法がある を解決参照を自動的なことは可能ですか?

使用

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

XSLT - ベースの検証

この変換は、次のXML文書に(あなたが適用されるが作られて
<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> 

よく形成され、を加えたitem):

<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>