Android和.NET Webservice - 解析返回的xml

时间:2011-03-28 16:57:05

标签: android xml web-services parsing xmlpullparser

所以我用网络服务做了一些“小”的事情并取得了一些成功,但是当我试图修补一些东西以获得乐趣时,我遇到了我认为错误地解析数据以获取信息的东西我需要的。我可以将整个xml作为一个字符串,但不仅仅是我需要的3个程序。 getPrograms和getInstitutions足够相似,如果我可以正确解析程序部分,我可以得到机构。我感到困惑的地方是我认为的“标签”以及它们与我实际使用的任何教程有多大差异。我也采用了XmlPullParser的方式,但不知道这是否是这样做的最好方法(是吗?)。我访问的格式如下:

<DataSet>
<xs:schema id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="tblPrograms">
<xs:complexType>
<xs:sequence>
<xs:element name="Program" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram>
<NewDataSet>
<tblPrograms diffgr:id="tblPrograms1" msdata:rowOrder="0">
<Program>Ancillary</Program>
</tblPrograms>
<tblPrograms diffgr:id="tblPrograms2" msdata:rowOrder="1">
<Program>Ancillary ESY</Program>
</tblPrograms>
<tblPrograms diffgr:id="tblPrograms3" msdata:rowOrder="2">
<Program>REAP</Program>
</tblPrograms>
</NewDataSet>
</diffgr:diffgram>
</DataSet>

我的源代码如下:

public class FirstScreen extends Activity {
    /** Called when the activity is first created. */

    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://www.ces.org/android/android.asmx";//must point to where service is located


    /** HelloAndroid method */
    //SOAP_ACTION = NAMESPACE + METHODNAME
    private static final String SOAP_ACTION = "http://tempuri.org/HelloAndroid";
    private static final String METHOD_NAME = "HelloAndroid";


    /** SelectInstitutionTypes method */
    //SOAP_ACTION = NAMESPACE + METHODNAME
    private static final String SOAP_ACTION_INSTITUTIONS = "http://tempuri.org/SelectInstitutionTypes";
    private static final String METHOD_NAME_INSTITUTIONS = "SelectInstitutionTypes";


    /** SelectPrograms method */
    //SOAP_ACTION = NAMESPACE + METHODNAME
    private static final String SOAP_ACTION_PROGRAMS = "http://tempuri.org/SelectPrograms";
    private static final String METHOD_NAME_PROGRAMS = "SelectPrograms";



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        getHelloAndroid();
        //getInstitutionTypes();
        getPrograms();

    }//end of onCreate




    private void getPrograms() {
        TextView tv3 = (TextView)findViewById(R.id.TextView03);//contains SelectInstitutionTypes information

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_PROGRAMS);   

        //soap serialization
        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//running 1.1
        soapEnvelope.dotNet=true;//to handle .net services asmx/aspx
        soapEnvelope.setOutputSoapObject(request);//package request

        //create transport object(s)
        HttpTransportSE aht = new HttpTransportSE(URL);

        try
        {      
            aht.debug = true;
            //make the call

            aht.call(SOAP_ACTION_PROGRAMS, soapEnvelope); //in/out

            SoapObject resultString = (SoapObject)soapEnvelope.getResponse();

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new StringReader (resultString.toString()));
            int eventType = xpp.getEventType();
            while(eventType != XmlPullParser.END_DOCUMENT){
                 if(eventType == XmlPullParser.START_DOCUMENT) {
                     System.out.println("Start document");
                 } else if(eventType == XmlPullParser.START_TAG) {
                     if(xpp.getName().equals("Program"))
                     System.out.println("Start tag "+xpp.getName());
                     System.out.println("Program"+ xpp.getAttributeName(0));
                 } else if(eventType == XmlPullParser.END_TAG) {
                     System.out.println("End tag "+xpp.getName());
                 } else if(eventType == XmlPullParser.TEXT) {
                     System.out.println("Text "+xpp.getText());
                 }
                 eventType = xpp.next();
                }
                System.out.println("End document");






            tv3.setBackgroundColor(Color.BLUE);         
            tv3.setText("STATUS: " + resultString /*ks.toString()*/ + "\n\n" + "AHTHOST:  " + 
                    aht.getHost() + "\n\n" + "NAHT STRING:  " + aht.toString());
        }
        catch(Exception e)
        {
            e.toString();
            e.printStackTrace();

            tv3.setText("EXCEPTION NAME:  " + e.toString().toString() + 
                    "\n\n" + "EXCEPTION MESSAGE:  " + e.getMessage() + " ");
        }
    }//end of getPrograms



    private void getInstitutionTypes() {

        TextView tv2 = (TextView)findViewById(R.id.TextView02);//contains SelectInstitutionTypes information
        //tv2.setText("TODO: SelectInstitutionTypes");

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_INSTITUTIONS);   

        //soap serialization
        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//running 1.1
        soapEnvelope.dotNet=true;//to handle .net services asmx/aspx
        soapEnvelope.setOutputSoapObject(request);//package request

        //create transport object(s)
        HttpTransportSE aht = new HttpTransportSE(URL);

        try
        {      
            aht.debug = true;
            //make the call
            aht.call(SOAP_ACTION_INSTITUTIONS, soapEnvelope); //in/out
            SoapObject resultString = (SoapObject)soapEnvelope.getResponse();


            tv2.setText("STATUS: " + resultString /*ks.toString()*/ + "\n\n" + "AHTHOST:  " + 
                    aht.getHost() + "\n\n" + "NAHT STRING:  " + aht.toString());

        }
        catch(Exception e)
        {
            e.toString();
            e.printStackTrace();

            tv2.setText("EXCEPTION NAME:  " + e.toString().toString() + 
                    "\n\n" + "EXCEPTION MESSAGE:  " + e.getMessage() + " ");
        }       
    }//end of getInstitutionTypes



    public void getHelloAndroid() {

        TextView tv = (TextView)findViewById(R.id.TextView01);//contains HelloAndroid information

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);   

        //soap serialization
        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//running 1.1
        soapEnvelope.dotNet=true;//to handle .net services asmx/aspx
        soapEnvelope.setOutputSoapObject(request);//package request

        //create transport object(s)
        HttpTransportSE aht = new HttpTransportSE(URL);

        try
        {      
            aht.debug = true;
            //make the call
            aht.call(SOAP_ACTION, soapEnvelope); //in/out
            SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();

            tv.setBackgroundColor(Color.BLUE);

            tv.setText("STATUS: " + resultString + "\n\n" + "AHTHOST:  " + 
                    aht.getHost() + "\n\n" + "NAHT STRING:  " + aht.toString());

        }
        catch(Exception e)
        {
            e.toString();
            e.printStackTrace();

            tv.setText("EXCEPTION NAME:  " + e.toString().toString() + 
                    "\n\n" + "EXCEPTION MESSAGE:  " + e.getMessage() + " ");
        }       
    }//end of getHelloAndroid


}//end of activity

1 个答案:

答案 0 :(得分:4)

经过大量研究后,我能够正确解析,所以我想我会回答我自己的问题。我还必须改变程序的结构以获得我需要的东西......或者至少在我开始在上面的代码中实现它之前了解我在做什么。所以下面的3个类是我过去得到的东西......现在。

public class MyXMLHandler extends DefaultHandler {

    Boolean currentElement = false;
    String currentValue = null;
    public static ProgramList programList = null;

    public static ProgramList getProgramList() {
        return programList;
    }

    public static void setProgramList(ProgramList programList) {
        MyXMLHandler.programList = programList;
    }

    //called when tag starts ( ex:- <tblPrograms>diffgr:id="tblPrograms1" msdata:rowOrder="0"</tblPrograms>  -- <tblPrograms> )
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        currentElement = true;

        //set up for hierarchy scan to place data within category
        if (localName.equals("DataSet"))
        {
            /** Start */ 
            programList = new ProgramList();
        } else if (localName.equals("tblPrograms")){//"NewDataSet" - DOES NOT WORK - F.C.
            /** Get attribute value */
            String attr = attributes.getValue(0);
            String attr2 = attributes.getValue(1);
            programList.setTable(attr);
            programList.setRowOrder(attr2);
        }

    }

    //called when tag closing ( ex:- <Program>Ancillary</Program>  -- </Program> )
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        currentElement = false;

        /** set value */ 
        if (localName.equalsIgnoreCase("Program"))
            programList.setProgram(currentValue);
        //else if (localName.equalsIgnoreCase("tblPrograms"))
            //programList.setWebsite(currentValue);

    }

    //called to get tag characters ( ex:- <Program>Ancillary</Program> -- to get Ancillary character )
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {

        if (currentElement) {
            currentValue = new String(ch, start, length);
            currentElement = false;
        }

    }

}

然后我在程序列表中有变量的getter和setter方法。

//contains getter and setter method for variables 
public class ProgramList {

    //variables
    private ArrayList<String> program = new ArrayList<String>();
    private ArrayList<String> rowOrder = new ArrayList<String>();
    private ArrayList<String> table = new ArrayList<String>();


    //in Setter method default it will return arraylist change that to add

    public ArrayList<String> getProgram() {
        return program;
    }

    public void setProgram(String program) {
        this.program.add(program);
    }

    public ArrayList<String> getRowOrder() {
        return rowOrder;
    }

    public void setRowOrder(String rowOrder) {
        this.rowOrder.add(rowOrder);
    }

    public ArrayList<String> getTable() {
        return table;
    }

    public void setTable(String table) {
        this.table.add(table);
    }

}

最后主要

public class XMLParsingExample extends Activity {

    //create object For SiteList class
    ProgramList programList = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //create a new layout to display the view 
        //LinearLayout layout = new LinearLayout(this);
        //layout.setOrientation(1);

        LinearLayout ll = (LinearLayout)findViewById(R.id.LL01);

        //create a new textview array to display the results 
        //TextView name[];
        //TextView website[];
        //TextView category[];


        try {

            //handle XML
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            //URL to parse XML Tags 
            URL sourceUrl = new URL(
                    "http://www.ces.org/android/android.asmx/SelectPrograms");

            //Create handler to handle XML Tags ( extends DefaultHandler )
            MyXMLHandler myXMLHandler = new MyXMLHandler();
            xr.setContentHandler(myXMLHandler);
            xr.parse(new InputSource(sourceUrl.openStream()));

        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }

        //get result from MyXMLHandler SitlesList Object 
        programList = MyXMLHandler.programList;

        //assign a textview array length by arraylist size 
        TextView name[] = new TextView[programList.getProgram().size()];
        TextView website[] = new TextView[programList.getProgram().size()];
        TextView category[] = new TextView[programList.getProgram().size()];




        //set the result text in textview and add it to layout 
        for (int i = 0; i < programList.getProgram().size(); i++) {
            name[i] = new TextView(this);
            name[i].setText("Program = "+programList.getProgram().get(i));
            name[i].setBackgroundColor(Color.BLUE);

            website[i] = new TextView(this);
            website[i].setText("Row Order = "+programList.getRowOrder().get(i));

            category[i] = new TextView(this);
            category[i].setText("Program Table = "+programList.getTable().get(i));

            //layout.addView(name[i]);
            //layout.addView(website[i]);
            //layout.addView(category[i]);
            ll.addView(name[i]);
            ll.addView(website[i]);
            ll.addView(category[i]);


        }

        //set the layout view to display 
        //setContentView(layout);
        setContentView(ll);

    }
}