Android и .NET Webservice - анализ возвращенного XML - PullRequest
0 голосов
/ 28 марта 2011

Итак, я сделал несколько «незначительных» вещей с веб-сервисами и добился некоторого успеха, но когда я попытался поиграться с чем-то интересным, я столкнулся с тем, что, как мне кажется, я неправильно разбираю данные, чтобы получить информацию что мне нужно Я могу получить весь 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 Ответ

4 голосов
/ 12 апреля 2011

Итак, после долгих исследований я смог правильно разобрать это, и решил, что отвечу на свой вопрос.Мне также пришлось изменить структуру моей программы, чтобы получить то, что мне нужно ... или хотя бы понять, что я делал, прежде чем я начал реализовывать ее в приведенном выше коде.Итак, 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);

    }
}
...