如何将本地 xml 文件转换为 org.ksoap2.serialization.SoapObject?
Posted
技术标签:
【中文标题】如何将本地 xml 文件转换为 org.ksoap2.serialization.SoapObject?【英文标题】:How can convert local xml file to org.ksoap2.serialization.SoapObject? 【发布时间】:2013-07-29 00:08:04 【问题描述】:我正在开发需要连接 web 服务以进行响应的 android web 应用程序。
我正在使用 kSOAP 进行 Web 服务调用过程。 [kSOAP 是一个 SOAP Web 服务客户端库,用于受限制的 Java 环境,例如 Applet 或 J2ME 应用程序。]
如果我将响应的 xml 保存到本地目录中,例如。 /mnt/sdcard/appData/config.xml 然后当我请求网络服务时,它首先会检查本地文件是否存在,然后将该文件视为响应文件,否则连接到服务器。
这个过程减少了响应时间并提高了应用程序的效率。
是否可以将它('config.xml')转换为 SOAP 对象?以及如何?
考虑我的 xml 本地文件如下:
config.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Response xmlns="http://testuser.com/webservices/response">
<Result>
<SName>Test User</SName>
<UnitDesc>SAMPLE Test </UnitDesc> <RefreshRate>60</RefreshRate>
<Out>
<Definition>
<Code>ABC</Code>
<Description>(Specific)</Description>
<Action>true</Action>
<Despatch>false</Despatch>
</Definition>
<Definition>
<Code>CDE</Code><Description>(Specific)</Description>
<ActionDate>true</ActionDate>
</Definition>
</Out>
<SampleText>
<string>Test XML Parsing</string>
<string>Check how to convert it to SOAP response</string>
<string>Try if you know</string>
</SampleText>
<GeneralData>
<Pair>
<Name>AllowRefresh</Name>
<Value>Y</Value>
</Pair>
<Pair>
<Name>ListOrder</Name>
<Value>ACCENDING</Value>
</Pair>
</GeneralData>
</Result>
</Response>
</soap:Body>
</soap:Envelope>
当前代码如下:
final String CONFIGURATION_FILE="config.xml";
File demoDataFile = new File("/mnt/sdcard/appData");
boolean fileAvailable=false;
File[] dataFiles=demoDataFile.listFiles(new FilenameFilter()
@Override
public boolean accept(File dir, String filename)
return filename.endsWith(".xml");
);
for (File file : dataFiles)
if(file.getName().equals(CONFIGURATION_FILE))
fileAvailable=true;
if(fileAvailable)
//**What to do?**
else
//Create the envelope
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//Put request object into the envelope
envelope.setOutputSoapObject(request);
//Set other properties
envelope.encodingStyle = SoapSerializationEnvelope.XSD;
envelope.dotNet = true;
String method="test";
synchronized (transportLockObject)
String soapAction = "http://testuser.com/webservices/response/"+method;
try
transport.call(soapAction, envelope);
catch (SSLHandshakeException she)
she.printStackTrace();
SecurityService.initSSLSocketFactory(ctx);
transport.call(soapAction, envelope);
//Get the response
Object response = envelope.getResponse();
//Check if response is available... if yes parse the response
if (response != null)
if (sampleResponse != null)
sampleResponse.parse(response);
else
// Throw no response exception
throw new NoResponseException("No response received for " + method + " operation");
【问题讨论】:
【参考方案1】:问题是如何将 xml 文件转换为 SoapObject。那么如何将输入的 xml 信封放入 ksoap2 调用中。
这种方法实际上在 HttpTransportSE 类中可用,即使这不是它的预期用途!
有一个方法“parseResponse”接收信封和输入流(您的 xml 文件)并更新信封输入标头和正文。但聪明的是,您可以将这些复制到 outHeader 和 outBody 字段中,然后映射字段的所有辛苦工作都消失了。
@Override
public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException
if ( getFileInputStream() != null )
parseResponse(envelope, getFileInputStream());
envelope.bodyOut = envelope.bodyIn;
envelope.headerOut = envelope.headerIn;
getFileInputStream().close();
super.call(soapAction,envelope);
【讨论】:
【参考方案2】:您可以像这样扩展HttpTransportSE
类并覆盖方法call
:
public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException if(localFileAvailable) InputStream is = new FileInputStream(fileWithXml); parseResponse(envelope, is); is.close(); else super.call(soapAction, envelope);
【讨论】:
以上是关于如何将本地 xml 文件转换为 org.ksoap2.serialization.SoapObject?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSdictionaries 的 NSarray 转换为 XML 文件?