Android: парсинг XML с помощью KSOAP - PullRequest
2 голосов
/ 03 января 2011

Я устанавливаю соединение с моими веб-сервисами (SOAP), это результат XML, который я получил от веб-сервисов, как я могу проанализировать этот результат без SAX-парсера ...

<maintag>
<item>
  <name>AndroidPeople</name> 
  <website category="android">www.androidpeople.com</website> 
</item>
<item>
  <name>iPhoneAppDeveloper</name> 
  <website category="iPhone">www.iphone-app-developer.com</website> 
  </item>
</maintag>

РЕДАКТИРОВАТЬ: / Мне было интересно проанализировать этот результат с Kxmlparser, кто-нибудь может сказать мне, как?

Большое спасибо!

ФАЙЛ МЫЛА

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);
       tv = (TextView)findViewById(R.id.TextView01);

       // Maak een nieuw Soap Request object en parameter 
       SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

       request.addProperty("GUID","4fe78-a4s4df8-65a4sd-465as4a"); 
       request.addProperty("InstallVersion","1");

       // Soapenvelope versie van webservice 
       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
       envelope.dotNet = true;

       envelope.encodingStyle = SoapSerializationEnvelope.XSD;
       envelope.setOutputSoapObject(request);

       // Transport gegevens vanaf URL 
       HttpTransportSE aht = new HttpTransportSE(URL);

       try
       {
           aht.call(SOAP_ACTION, envelope);
           SoapPrimitive resultsString = (SoapPrimitive)envelope.getResponse();
           tv.setText("Result :" + resultsString);
       }

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

Ответы [ 2 ]

4 голосов
/ 13 января 2011

В зависимости от вашего веб-сервиса ответ, который вы получите, будет либо SoapPrimitive, либо SoapObject. Скорее всего, это более сложный ответ и, следовательно, ваш код

SoapPrimitive resultsString = (SoapPrimitive)envelope.getResponse();

следует заменить на что-то вроде этого

SoapObject response = (SoapObject)envelope.getResponse();

которые в свою очередь имеют атрибуты и свойства со значениями из вашего ответа. Возможно, проще всего установить там точку останова и проверить ее в режиме реального времени.

Вы также можете посмотреть мою вики-документацию по отладке и просмотреть необработанный запрос и ответ xml здесь: http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks

0 голосов
/ 03 января 2011

Java имеет встроенный синтаксический анализатор XML.Вы можете увидеть образец недавнего файла, который я сделал для этого здесь: https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java (он внизу страницы)

Вот три метода, которые вас больше всего интересуют:

private static Document getRSS(Context context, boolean backgroundUpdate,
        String url) {

    if (!Tools.checkNetworkState(context, backgroundUpdate))
        return null;

    // Network is available get the document.
    try {
        Document doc;
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder();
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);
        doc = builder.parse(response.getEntity().getContent());
        return doc;
    } catch (IOException e) {
        return null;  // The network probably died, just return null
    } catch (SAXException e) {
        // Problem parsing the XML, log and return nothing
        Log.e("NCRSS", "Error parsing XML", e);
        return null;
    } catch (Exception e) {
        // Anything else was probably another network problem, fail silently
        return null;
    }
}

private static Show getShowFromRSS(Context context, Document feed,
        String feedUrl) {
    try {
        // There should be one channel in the feed, get it.
        // Also, the cast should be okay if the XML is formatted correctly
        NodeList item = feed.getElementsByTagName("channel");
        Element el = (Element)item.item(0);

        String title;
        NodeList titleNode = el.getElementsByTagName("title");
        if (titleNode == null || titleNode.getLength() < 1)
            title = context.getString(R.string.default_title);
        else
            title = titleNode.item(0).getFirstChild().getNodeValue();

        String author;
        NodeList authorNode = el.getElementsByTagName("author");
        if (authorNode == null || authorNode.getLength() < 1)
            author = context.getString(R.string.default_author);
        else
            author = authorNode.item(0).getFirstChild().getNodeValue();

        String desc;
        NodeList descNode = el.getElementsByTagName("comments");
        if (descNode == null || descNode.getLength() < 1)
            desc = context.getString(R.string.default_comments);
        else
            desc = descNode.item(0).getFirstChild().getNodeValue();

        String imageUrl;
        NodeList imagNode = el.getElementsByTagName("image");
        if(imagNode != null) {
            Element ima = (Element)imagNode.item(0);
            if (ima != null) {
                NodeList urlNode = ima.getElementsByTagName("url");
                if(urlNode == null || urlNode.getLength() < 1)
                    imageUrl = null;
                else
                    imageUrl =
                        urlNode.item(0).getFirstChild().getNodeValue();
            } else
                imageUrl = null;
        } else
            imageUrl = null;

        return new Show(title, author, feedUrl, desc, imageUrl, -1, -1);
    } catch (Exception e) {
        // Any parse errors and we'll log and fail
        Log.e("NCRSS", "Error parsing RSS", e);
        return null;
    }
}

private static List<Episode> getEpisodesFromRSS(Context context,
        Document feed) {
    try {
        ArrayList<Episode> episodes = new ArrayList<Episode>();
        NodeList items = feed.getElementsByTagName("item");
        for(int i = 0; i < items.getLength(); i++) {
            // Fetch the elements
            // Safe if it's an actual feed.
            Element el = (Element)items.item(i);

            String title;
            NodeList titleNode = el.getElementsByTagName("title");
            if (titleNode == null || titleNode.getLength() < 1)
                title = context.getString(R.string.default_title);
            else
                title = titleNode.item(0).getFirstChild().getNodeValue();

            String author;
            NodeList authorNode = el.getElementsByTagName("author");
            if (authorNode == null || authorNode.getLength() < 1)
                author = context.getString(R.string.default_author);
            else
                author = authorNode.item(0).getFirstChild().getNodeValue();

            String date;
            NodeList dateNode = el.getElementsByTagName("pubDate");
            if (dateNode == null || dateNode.getLength() < 1)
                date = context.getString(R.string.default_date);
            else
                date = dateNode.item(0).getFirstChild().getNodeValue();

            String desc;
            NodeList descNode = el.getElementsByTagName("comments");
            if (descNode == null || descNode.getLength() < 1)
                desc = context.getString(R.string.default_comments);
            else
                desc = descNode.item(0).getFirstChild().getNodeValue();

            String url;
            NodeList urlNode = el.getElementsByTagName("enclosure");
            if (urlNode == null || urlNode.getLength() < 1)
                url = "";
            else {
                Element urlEl = (Element)urlNode.item(0);
                if(urlEl == null)
                    url = "";
                else
                    url = urlEl.getAttribute("url");
            }


            // Convert the date string into the needed integer
            // TODO, use a non-depricated method
            long dateMills;
            try {
                dateMills = Date.parse(date);
            } catch (Exception e) {
                dateMills = 0;
            }

            // Add the new episode
            // ShowId and played doesn't really matter at this point
            episodes.add(new Episode(title, author, desc, "", url,
                    dateMills, 0, false));
        }
        return episodes;

    } catch (Exception e) {
        // Any parse errors and we'll log and fail
        Log.e("NCRSS", "Error parsing RSS", e);
        return null;
    }
}
...