2011-12-19 2 views
1

Я создаю приложение для 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(); 

    } 

ответ

2

Я работал на это в то же время. Очень просто, но я не видел других примеров этого при поиске. Просто нужно использовать метод setNamespace на PropertyInfo, используемый для построения запроса. Например:

pi.setNamespace("http://example.com/nbi"); 
0

Вы можете получить эффект пространства имен по умолчанию, используя следующую схему.

SoapObject request = new SoapObject(NAMESPACE, "GetRequest"); 
SoapObject data = new SoapObject("", "Port"); 
request.addSoapObject(data); 

Это должно дать вам что-то вроде:

<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> 
<GetRequest id="o0" c:root="1" xmlns:n0="http://dummy.com/nbi"> 
    <Port i:type="d:string">Data</Port> 
</GetRequest> 
</v:Body></v:Envelope> 

Вы также можете сделать envelope.setAddAdornments(false) на конверте, чтобы получить еще лучше:

<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> 
<GetRequest xmlns:n0="http://dummy.com/nbi"> 
    <Port i:type="d:string">Data</Port> 
</GetRequest> 
</v:Body></v:Envelope> 
2

Если вы хотите удалить только пространство имен из свойства вы можете установить пустую строку при создании PropertyInfo. Нравится этим:

PropertyInfo pi = new PropertyInfo(); 
pi.setNamespace(""); 
pi.setName("myName"); 
pi.setValue("myString"); 
pi.setType(String.class); 
Смежные вопросы