Я создаю приложение для Android, которое должно получить некоторые данные через интерфейс SOAP. Я пытаюсь использовать модуль KSOAP2 (используя ksoap2-android-2.6.0-jar-with-dependencies.jar). У меня возникли проблемы с получением KSOAP, чтобы дать мне правильные префиксы пространства имен в дочерних элементах.Пространства имен KSOAP и форматирование вывода XML
Я хочу это:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<n0:GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi">
<n0:Port i:type="d:string">Data</n0:Port>
</n0:GetRequest>
</v:Body></v:Envelope>
но ksoap2 дает мне это:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<n0:GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi">
<Port i:type="d:string">Data</Port>
</n0:GetRequest>
</v:Body></v:Envelope>
Единственное различие в том, что элемент порта в запросе 2 XML не имеет n0 префикс в тег метки.
Я изучал правильную теорию xml пространства имен, и мне кажется, что хорошо сформированный XML должен либо иметь префикс пространства имен для всех соответствующих элементов, либо родительский элемент должен иметь определение пространства имен по умолчанию. Играя с SoapUI, я могу вручную отправлять запросы на свой сервер и использовать любой из этих параметров для работы, но я не могу решить, как сделать ksoap произведением формата запроса. то есть я не могу решить, как создать элемент с пространством имен по умолчанию или как создать элемент, который имеет префикс пространства имен для каждого дочернего элемента. Я пробовал все варианты настроек, о которых я могу думать, но единственное (неэлегантное) решение, которое я могу придумать, - это вручную добавить префикс к ярлыку Port. Кто-нибудь отработал, как сделать, чего я хочу? Мой SOAP-сервер не любит запрос без строгого синтаксиса форматирования XML.
Вот соответствующий фрагмент кода:
private static final String namespace = "http://dummy.com/nbi";
private static final String URL = "http://192.168.254.117/soap/nbi";
String SOAP_ACTION = namespace + "/" + methodCall;
SoapObject request = new SoapObject(namespace, methodCall);
PropertyInfo pi = new PropertyInfo();
pi.setName("myName");
pi.setValue("myString");
pi.setType(String.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = false;
envelope.setAddAdornments(false);
envelope.implicitTypes = false;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
try
{
List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
headerList.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("nbsam:nbsam".getBytes())));
androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
SoapObject response = (SoapObject)envelope.getResponse();
String result = response.getProperty(0).toString();
}