Может ли документ XML иметь 2 элемента с одинаковым идентификатором или нет?

Я пытаюсь интегрировать приложение Android с веб-сервисом SOAP, используя kSoap2. Мне удается сделать запрос и получить некоторые данные обратно, но когда происходит анализ ответа, у меня есть следующее 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 самостоятельно, поэтому я сказал разработчикам, что не понимаю, как это возможно, потому что я думал, что сама спецификация XML говорит, что идентификаторы должны быть уникальными. И вот что они ответили:

В этом случае это возможно, потому что atribbute "id" - это не тип данных "ID", а тип данных "URN". Атриббут ссылается на уникальный идентификатор в реестре, и это не идентификатор элемента, который он сам. В этом приложении мы используем Информационную модель реестра ebXML версии 3.0 по умолчанию. Вы можете найти больше информации и примеров в документе оазиса: https://docs.oasis-open.org/regrep/v3.0/specs/regrep-rim-3.0-os.pdf

И теперь я в замешательстве. Так может ли быть несколько элементов с одинаковым идентификатором в документе XML или нет? И если да, есть ли способ настроить kSOAP2, чтобы он игнорировал этот двойной идентификатор?

1 ответ

XML-документ с дублирующимися значениями идентификаторов корректен, но недействителен. Синтаксический анализатор XML успешно прочитает такой документ, если он работает как анализатор без проверки.

Я не знаю библиотеку, которую вы используете для анализа, поэтому я понятия не имею, возможно ли отключить проверку или игнорировать ошибки проверки.

Другие вопросы по тегам