2013-07-29 27 views
10

Pracuję nad aplikacją internetową dla Androida, która musi łączyć się z usługą sieciową w celu uzyskania odpowiedzi.Jak przekonwertować plik lokalnego xml na org.ksoap2.serialization.SoapObject?

Używam kSOAP dla procesu wywoływania usługi sieciowej. [kSOAP jest biblioteką serwis internetowy klient SOAP dla ograniczonych środowiskach, takich jak Java, aplety lub aplikacji J2ME.]

Jeśli mam oszczędności, które odpowiedziały xml do katalogu lokalnego, np. /mnt/sdcard/appData/config.xml, a następnie, gdy kiedykolwiek poprosię o usługę internetową, najpierw sprawdza, czy plik lokalny jest tam, a następnie uważają, że plik jako plik odpowiedzi w inny sposób połączyć się z serwerem.

Proces ten skraca czas reakcji i zwiększa efektywność aplikacji.

Czy można go przekonwertować ("config.xml") na obiekt SOAP? I jak?

Rozważmy mój lokalny plik XML jest jak poniżej:

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> 

Aktualny kod znajduje się poniżej:

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"); 
     } 

} 

Odpowiedz

8

można rozszerzyć HttpTransportSE klasę i zastąpić metoda call podobna do poniższej:

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); 
    } 
} 
+0

Dzięki to działa dobrze dla mnie. –

1

Pytanie było jak przekonwertować plik xml do SoapObject. W jaki sposób uzyskać kopertę wejściową xml do wywołania ksoap2.

Sposób wykonania tej czynności jest faktycznie dostępny w klasie HttpTransportSE, nawet jeśli nie było to zamierzone użycie!

Istnieje metoda "parseResponse", która przyjmuje kopertę i strumień wejściowy (plik xml) i aktualizuje nagłówek i treść wejściowej koperty. Ale sprytne jest to, że możesz je skopiować do pól OutHeader i outBody, a wtedy cała ciężka praca mapowania pól zniknie.

 @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); 

}