2

我正在尝试使用 kSoap2 将 Android 应用程序与 SOAP 网络服务集成。我设法发出请求并取回一些数据,但是当响应解析发生时,我有以下 RuntimeException:

W/System.err: java.lang.RuntimeException: double ID
                  at org.ksoap2.serialization.SoapSerializationEnvelope.resolveReference(SoapSerializationEnvelope.java:462)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:439)
                  at com.easywsdl.exksoap2.serialization.ExSoapSerializationEnvelope.read(ExSoapSerializationEnvelope.java:86)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:304)
                  at com.easywsdl.exksoap2.serialization.ExSoapSerializationEnvelope.readUnknown(ExSoapSerializationEnvelope.java:93)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:434)
                  at com.easywsdl.exksoap2.serialization.ExSoapSerializationEnvelope.read(ExSoapSerializationEnvelope.java:86)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:304)
                  at com.easywsdl.exksoap2.serialization.ExSoapSerializationEnvelope.readUnknown(ExSoapSerializationEnvelope.java:93)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:434)
                  at com.easywsdl.exksoap2.serialization.ExSoapSerializationEnvelope.read(ExSoapSerializationEnvelope.java:86)
                  at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:146)
W/System.err:     at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:140)
                  at com.easywsdl.exksoap2.mtom.MTOMSoapSerializationEnvelope.parse(MTOMSoapSerializationEnvelope.java:70)
                  at org.ksoap2.transport.Transport.parseResponse(Transport.java:129)
                  at org.ksoap2.transport.HttpTransportSE.parseResponse(HttpTransportSE.java:304)
                  at com.easywsdl.exksoap2.transport.AdvancedHttpsTransportSE.parseResponse(AdvancedHttpsTransportSE.java:35)
                  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:276)
                  at com.easywsdl.exksoap2.transport.AdvancedHttpsTransportSE.call(AdvancedHttpsTransportSE.java:51)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12.sendRequest(DocumentRegistry_Binding_Soap12.java:102)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12.execute(DocumentRegistry_Binding_Soap12.java:181)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12.DocumentRegistry_RegistryStoredQuery(DocumentRegistry_Binding_Soap12.java:147)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12$2.Func(DocumentRegistry_Binding_Soap12.java:168)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12$2.Func(DocumentRegistry_Binding_Soap12.java:166)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12$3.doInBackground(DocumentRegistry_Binding_Soap12.java:218)
                  at be.brusafe.brusafeplus.xds.iti18.DocumentRegistry_Binding_Soap12$3.doInBackground(DocumentRegistry_Binding_Soap12.java:207)
                  at android.os.AsyncTask$2.call(AsyncTask.java:333)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                  at java.lang.Thread.run(Thread.java:764)

事实上,在响应中,我有 2 个类型不同但 id 属性值相同的元素。

<ExtrinsicObject home="urn:oid:1.3.6.1.4.1.48336.1" id="urn:uuid:3468543d-5033-4d6b-86a5-f8a52fd0070e"
    isOpaque="false"
    lid="urn:uuid:3468543d-5033-4d6b-86a5-f8a52fd0070e"
    mimeType="text/xml"
    objectType="urn:uuid:7edca82f-054d-47f2-a032-9b2a5b5186c1"
    status="urn:oasis:names:tc:ebxml-regrep:StatusType:Approved">

和:

<ObjectRef home="urn:oid:1.3.6.1.4.1.48336.1"
    id="urn:uuid:3468543d-5033-4d6b-86a5-f8a52fd0070e" />

我自己不开发 SOAP Web 服务,所以我告诉开发人员我不明白这怎么可能,因为我认为 XML 规范本身说 ID 必须是唯一的。这就是他们的回答:

在这种情况下,这是可能的,因为属性“id”不是数据类型“ID”而是数据类型“URN”。属性是指注册表中的唯一 id,它不是它自己的元素的 id。在此应用程序中,我们默认使用 ebXML 注册表信息模型版本 3.0。您可以在 oasis 的文档中找到更多信息和示例: https ://docs.oasis-open.org/regrep/v3.0/specs/regrep-rim-3.0-os.pdf

现在我很困惑。那么在一个 XML 文档中是否可以存在多个具有相同 ID 的元素?如果是的话,有没有办法配置 kSOAP2 让它忽略那个双 ID?

4

1 回答 1

0

具有重复 ID 值的 XML 文档格式正确但无效。如果 XML 解析器作为非验证解析器运行,它将成功读取此类文档。

我不知道您用来进行解析的库,所以我不知道是否可以禁用验证或忽略验证错误。

于 2018-07-19T08:31:19.667 回答