2011-12-19 39 views
1

我正在構建一個需要通過SOAP接口獲取數據的Android應用程序。我試圖使用KSOAP2模塊(使用kso​​ap2-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> 

唯一的區別是,在第二屆XML請求的端口元素沒有對的N0前綴標籤標籤。

我一直在適當的命名空間xml理論上刷牙,在我看來,格式良好的XML應該在所有相關元素上具有名稱空間前綴,或者父元素應該具有默認名稱空間定義。使用SoapUI我可以手動向我的服務器提交請求,並讓這兩個選項都起作用,但是我無法弄清楚如何讓ksoap產生任何請求格式。即我無法弄清楚如何使用默認名稱空間生成元素,或者如何生成在每個子元素上都有名稱空間前綴的元素。 我已經嘗試了我能想到的所有設置變體,但我能想出的唯一(不雅)解決方案是手動將前綴添加到端口標籤。 有沒有人制定了如何做到我想要的? 我的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

我在此期間制定了這一點。 非常簡單,但我沒有看到其他的例子,當搜索。 只需在PropertyInfo上使用setNamespace方法來構造請求。像這樣:

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

如果你想只刪除命名空間從Property中可以在創建PropertyInfo時設置一個空字符串。像這樣:

PropertyInfo pi = new PropertyInfo(); 
pi.setNamespace(""); 
pi.setName("myName"); 
pi.setValue("myString"); 
pi.setType(String.class);