@[toc]
1. 使用soapui测试时存在cdata嵌套的问题
说明:如果使用soapui进行webservice测试时要求数据放置在<![CDATA[ 和]]>中间,但是如果传递的XML文件中也存在cdata,并且不做处理的话,会报错:com.ctc.wstx.exc.WstxParsingException: Unexpected close tag </ROWKEY>; expected </message>. at [row,col {unknown-source}]: [11,99] ,这是由于XML中cdata不允许嵌套导致的。错误示例如下:
对于如下
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="ws.dis.clinical.viewigh.com">
<soapenv:Header/>
<soapenv:Body>
<ws:req1>
<!--Optional:-->
<message>
<![CDATA[
<Root>
<ROWKEY><![CDATA[0026|1242010044162664X7|000303786200|2|2336747&3|1242010044162664X7.EMR]]></ROWKEY>
]]>
</Root>
</message>
</ws:operationRequest>
</soapenv:Body>
</soapenv:Envelope>
解决方案:
可以将message内容中CDATA里面的]]>替换为]]]]><![CDATA[>,替换后正确内容如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="ws.dis.clinical.viewigh.com">
<soapenv:Header/>
<soapenv:Body>
<ws:req1>
<!--Optional:-->
<message>
<![CDATA[
<Root>
<ROWKEY><![CDATA[0026|1242010044162664X7|000303786200|2|2336747&3|1242010044162664X7.EMR]]]]><![CDATA[></ROWKEY>
]]>
</Root>
</message>
</ws:operationRequest>
</soapenv:Body>
</soapenv:Envelope>
2. webservice 请求报错不允许有匹配 "[xX][mM][lL]" 的处理指令目标
错误信息如下:
Caused by: org.xml.sax.SAXParseException; systemId: file://; lineNumber: 4; columnNumber: 6; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1465)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(XMLScanner.java:745)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:1049)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(XMLScanner.java:713)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:891)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3422)
解决方案说明: 在webservice中,正确的soap请求格式如下
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="dis.ws.vh.com">
<soapenv:Header/>
<soapenv:Body>
<ws:req1> <!-- 这里默认是接口中的方法名称 -->
<!--Optional:-->
<message> <!-- 这里是请求参数名称 -->
<![CDATA[
<!-- type: EnsLib.EDI.XML.Document id: 22938 -->
<POOR_IN200901UV xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" ITSVersion="XML_1.0" xsi:schemaLocation="urn:hl7-org:v3 ../../Schemas/POOR_IN200901UV13.xsd">
...
</POOR_IN200901UV>
]]>
</message>
</ws:req1>
</soapenv:Body>
</soapenv:Envelope>
在<![CDATA[ ]]>数据中间,不允许存在xml定义说明,也就是<?xml version="1.0"?> 本次的错误就是由于存在xml标记引起的。