2011-08-27 165 views
0

我正在使用Web服務,因爲它的輸出是一個XML字符串。我解析成一個文件,並通過一個讓每個子節點的值之一,並插入我的SQLlite表如下所示:XML解析錯誤

public void DownloadAndInsertProblemAndReasonCode(String serverIPAddress, 
      String deviceId) { 
     String SOAP_ACTION = "http://VisionEPODWebService/GetProblemAndReasonCodesNew"; 
     String OPERATION_NAME = "GetProblemAndReasonCodesNew"; 
     String WSDL_TARGET_NAMESPACE = "http://VisionEPODWebService/"; 
     String SOAP_ADDRESS = ""; 

     SOAP_ADDRESS = "http://" + serverIPAddress 
       + "/VisionEPODWebService/SystemData.asmx"; 
     SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, 
       OPERATION_NAME); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER10); 
     request.addProperty("deviceID", deviceId); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 
     HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
     try { 
      httpTransport.call(SOAP_ACTION, envelope); 
      Object response = envelope.getResponse(); 
      DocumentBuilderFactory docBuilberFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder docBuilder = docBuilberFactory.newDocumentBuilder(); 
      InputSource inputSource = new InputSource(); 
      inputSource 
        .setCharacterStream(new StringReader(response.toString())); 
      Document doc = docBuilder.parse(inputSource); 
      NodeList nodesProblemCode = doc 
        .getElementsByTagName("tblProblemCode"); 
      ContentValues initialProblemCodeValues = new ContentValues(); 
      dbAdapter = new DatabaseAdapter(this.context); 
      dbAdapter.open(); 
      dbAdapter.BeginTransaction(); 
      dbAdapter.DeleteRecord("tblProblemCode", "", ""); 

      for (int i = 0; i < nodesProblemCode.getLength(); i++) { 
       Element element = (Element) nodesProblemCode.item(i); 

       NodeList PKProblemCode = element 
         .getElementsByTagName("PKProblemCode"); 
       Element line = (Element) PKProblemCode.item(0); 
       initialProblemCodeValues.put("PKProblemCode", 
         getCharacterDataFromElement(line).toString()); 

       NodeList ProblemCode = element 
         .getElementsByTagName("ProblemCode"); 
       line = (Element) ProblemCode.item(0); 
       initialProblemCodeValues.put("ProblemCode", 
         getCharacterDataFromElement(line)); 

       NodeList ProblemCodeDescription = element 
         .getElementsByTagName("ProblemCodeDescription"); 
       line = (Element) ProblemCodeDescription.item(0); 
       initialProblemCodeValues.put("ProblemCodeDescription", 
         getCharacterDataFromElement(line).toString()); 

       NodeList VWReturn = element.getElementsByTagName("VWReturn"); 
       line = (Element) VWReturn.item(0); 
       initialProblemCodeValues.put("VWReturn", 
         getCharacterDataFromElement(line).toString()); 

       dbAdapter.InsertRecord("tblProblemCode", "", 
         initialProblemCodeValues); 
      } 

      NodeList nodesReasonCode = doc 
        .getElementsByTagName("tblReasonCode"); 
      ContentValues initialReasonCodeValues = new ContentValues(); 
      dbAdapter.DeleteRecord("tblReasonCode", "", ""); 
      for (int i = 0; i < nodesReasonCode.getLength(); i++) { 
       Element element = (Element) nodesReasonCode.item(i); 

       NodeList PKReasonCode = element 
         .getElementsByTagName("PKReasonCode"); 
       Element line = (Element) PKReasonCode.item(0); 
       initialReasonCodeValues.put("PKReasonCode", 
         getCharacterDataFromElement(line).toString()); 

       NodeList ReasonDescription = element 
         .getElementsByTagName("ReasonDescription"); 
       line = (Element) ReasonDescription.item(0); 
       initialReasonCodeValues.put("ReasonDescription", 
         getCharacterDataFromElement(line)); 

       dbAdapter.InsertRecord("tblReasonCode", "", 
         initialReasonCodeValues); 
      } 
      dbAdapter.SetSucessfulTransaction(); 
      dbAdapter.EndTransaction(); 
      dbAdapter.close(); 
     } 

     catch (Exception exception) { 
      exception.toString(); 
     } 

    } 


public static String getCharacterDataFromElement(Element e) { 

     Node child = e.getFirstChild(); 
     if (child instanceof CharacterData) { 
      CharacterData cd = (CharacterData) child; 
      return cd.getData(); 
     } 
     return "?"; 
    } 

的問題是,經過一段時間的XML字符串會不會有一些子節點。例如 「ProblemCode」子節點.....當時代碼顯示錯誤。

如何檢查文檔中是否存在元素,或者元素是否存在值?

回答

3

我認爲你需要檢查,如果孩子節點存在:專門針對您的問題節點:

NodeList NL = element.getElementsByTagName("PKProblemCode"); 
if ((NL==null)||(NL.getLength()==0)) { 
    //No such node so use a default instead 
} else 
    Element line = (Element) PKProblemCode.item(0); 
+0

感謝您的支持.. –

+0

高興,這是有益的 – Elemental