我正在尝试访问数据供应商的SOAP Web服务。服务器是用Java编写的。我从Perl访问它。由于某些特殊性,我必须自己发送原始的http请求,而不是使用SOAP Lite包。
客户端工作正常。我可以调用大多数方法,并且我得到的响应看起来也很好,这意味着请求,响应和命名空间等都很好。但是,有一种方法我遇到了麻烦。其请求数据类型的wsdl如下:
<xs:element name="method1">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="xmlContent" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
此方法的独特之处在于它接受一个字符串元素xmlContent,它实际上是xml内容。这是我的要求:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<namesp1:method1 xmlns:namesp1="http://vendor.com">
<xmlContent xsi:type="xsd:string">
<?xml version="1.0" encoding="UTF-8"?>
<product id="ABC" type="CSV">
<columns>
<column name="DATE" format="yyyymmdd" />
<column name="COUNTRY" format="DESC"/>
</columns>
</product>
</xmlContent>
</namesp1:method1>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我将请求保存在文件中,并将文件读入Perl,并发送http post请求。我得到的错误字符串是:Validation Error(s): Content is not allowed in prolog
。
我用Google搜索,似乎是Java无法识别第二条<?xml version="1.0" encoding="UTF-8"?>
行。我尝试删除该行,但我得到了一个不同的错误:premature end of file
我的问题:我是否正确地使用xml内容部分?是什么导致错误?我该如何解决?
答案 0 :(得分:0)
xmlContent
元素的数据类型为xsd:string
。这表明它应该是一个包含看起来像XML的东西的长字符串。它被命名为 xmlContent 是偶然的。他们只是选择了这个任意名称。
尝试传递一个包含XML的字符串,而不是一堆实际的XML标记。使用CDATA可以逃避它。
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<namesp1:method1 xmlns:namesp1="http://vendor.com">
<xmlContent xsi:type="xsd:string">
<![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<product id="ABC" type="CSV">
<columns>
<column name="DATE" format="yyyymmdd" />
<column name="COUNTRY" format="DESC"/>
</columns>
</product>]]>
</xmlContent>
</namesp1:method1>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
请注意<![CDATA[
和<?xml>
之间不应该有换行符或其他空格,因为这会被视为内容的一部分,而另一端的服务器可能会阻塞将该部分解析为实际XML时。然而,<![CDATA[
前面的空格很好,因为它只是外部XML中的任意空格,会被忽略。