Arun Kumar
Arun Kumar

Reputation: 877

XML Parsing Error

I am consuming a web service as its output is an XML string. I am parsing it into a document and getting each child node value one by one and inserting into my SQLlite table as shown below:

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

The problem is that after some time the XML string will not have some of child node. For example "ProblemCode" child node.....at that time the code shows error.

How can I check whether there exists an element in the document, or whether values exist or not for the element?

Upvotes: 0

Views: 549

Answers (1)

Elemental
Elemental

Reputation: 7466

I think you need to check if the child node exists: specifically for your problem node:

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

Upvotes: 3

Related Questions