Android 端無原生 DataSet 類別,需自行將資料序列化為符合 .NET WebService 預期的 SOAP XML 格式。
DataSet。diffgr:diffgram、xs:schema、資料列結構 (<Table><Column>value</Column></Table>)。StringBuilder 動態產生相同結構 XML。Content-Type: text/xml; charset=utf-8,加入 SOAPAction 標頭,將 XML 字串寫入請求本體。public String sendDataSet(List<Map<String, Object>> data) {
StringBuilder soap = new StringBuilder();
soap.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
soap.append("<soap:Envelope xmlns:soap=\"https://schemas.xmlsoap.org/soap/envelope/\" ");
soap.append("xmlns:xsi=\"https://www.w3.org/2001/XMLSchema-instance\" ");
soap.append("xmlns:xsd=\"https://www.w3.org/2001/XMLSchema\">");
soap.append("<soap:Body>");
soap.append("<YourMethodName xmlns=\"https://tempuri.org/\">");
soap.append("<dataSet>");
// 這裡需依實際 schema 產生 diffgram
soap.append("<diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" ");
soap.append("xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\">");
soap.append("<NewDataSet xmlns=\"\">");
for (Map<String, Object> row : data) {
soap.append("<Table diffgr:id=\"Table1\" msdata:rowOrder=\"0\">");
for (Map.Entry<String, Object> col : row.entrySet()) {
soap.append("<").append(col.getKey()).append(">")
.append(escapeXml(col.getValue().toString()))
.append("</").append(col.getKey()).append(">");
}
soap.append("</Table>");
}
soap.append("</NewDataSet></diffgr:diffgram>");
soap.append("</dataSet></YourMethodName></soap:Body></soap:Envelope>");
return postSoapRequest(soap.toString());
}
private String escapeXml(String s) {
return s.replace("&", "&").replace("<", "<").replace(">", ">")
.replace("\"", """).replace("'", "'");
}
xmlns 差異都會導致伺服器反序列化失敗。yyyy-MM-ddTHH:mm:ss (ISO 8601)。