【问题标题】:How to parse xml string with xmlpullparser android如何使用xmlpullparser android解析xml字符串
【发布时间】:2013-04-15 01:10:56
【问题描述】:

我想解析一个 XML 字符串并在 EditText 中显示它,但我不能,我不明白可能是什么问题,请帮忙,我的代码:

私有字符串 xmlc = "<game><cel>5</cel><val>2</val></game>";

private CharSequence readXML(String xmlc2) throws XmlPullParserException {


    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser xpp = factory.newPullParser();

    String results = "";
    String celda = "";
    String valor = "";

    xpp.setInput(new StringReader (xmlc2));
    int eventType = xpp.getEventType();
    String tagName = xpp.getName();

    try {       
        while (eventType != XmlPullParser.END_DOCUMENT) {

            if(tagName.equalsIgnoreCase("cell")){
                celda = xpp.nextText();
            } else if(tagName.equalsIgnoreCase("val")){
                valor = xpp.nextText();
            }       
            xpp.nextTag();      
        }       
    } catch (Exception e) {
        Toast.makeText(this, "error!", Toast.LENGTH_LONG).show();
    }
    return celda;
}

感谢您的建议,现在我可以将字符串 xml 作为参数发送并进行解析,但我不知道如何保存找到的 2 个值并在不同的 EditText 中显示每个值?

private EditText et02;
private EditText et03;
private String xmlc = "<game><cel>5</cel><val>2</val></game>";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText et02 = (EditText)findViewById(R.id.et02);
    EditText et03 = (EditText)findViewById(R.id.et03);

    TextView myXmlContent = (TextView)findViewById(R.id.xml_tv);
    String stringXmlContent;

    stringXmlContent = getAllXML();
    myXmlContent.setText(stringXmlContent);

}
public String getAllXML(){

    Activity activity = this;
    String str = "";

    //For file source
    //Resources res = activity.getResources();
    //XmlResourceParser xpp = res.getXml(R.xml.test);


    try {
        //For String source
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new StringReader(xmlc)); 

        xpp.next();
        int eventType = xpp.getEventType();                        

          while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT) {
              if (xpp.getEventType()==XmlPullParser.START_TAG) {
                  if (xpp.getName().equals("cel")) {
                      str += "\ncell : "+xpp.nextText();
                  }
                  if (xpp.getName().equals("val")) {
                      str += "\nval : "+xpp.nextText();                       
                  }
              }
              xpp.next();
          }

    } catch (XmlPullParserException e) {
          e.printStackTrace();
    } catch (IOException e) {
          e.printStackTrace();
    }
    return str;
}

【问题讨论】:

  • 有什么问题?
  • 您在代码中使用 xmlc2 而不是 xmlc(如果它不在其他类中),并且像在 xml 中那样搜索“cell”而不是“cel”。
  • 我不知道如何检索值“celda”和“valor”以在文本视图中显示,我还在bucle中添加“Toasts”以显示值但我不显示任何东西。简而言之,我想发送一个参数作为输入并获取 2 个值作为输出。
  • 我正在尝试查看标签:String celda = xpp.nextText(); Toast.makeText(this, celda, Toast.LENGTH_LONG).show(); ...是错的还是好的?
  • 您最好在 Eclipse 中使用断点调试您的应用程序。吐司不是最好的选择。或使用Log.d("LOGTAG", "some msg here");,您可以在 ddms 中阅读此内容。

标签: android string xml-parsing xmlpullparser


【解决方案1】:

//调用web api并尝试下面的xml解析代码

new GettingData().execute();

private class GettingDataextends AsyncTask<String, String, String> {

        private static final String PLACEMARK = "Placemark";
        private static final String NAME = "name";
        private static final String DESCRIPTION = "description";
        private static final String COORDINATES = "coordinates";
        private ProgressDialog progressDialog;
        private String serverName, trackName;


        @Override
        protected void onPreExecute() {

            super.onPreExecute();
                progressDialog = new ProgressDialog(mContext);
                progressDialog.setMessage("Loading ...");
                progressDialog.setIndeterminate(false);
                progressDialog.setCancelable(false);
                progressDialog.show();


        }

        @Override
        protected String doInBackground(String... args) {

            try {

                url = "Your_Url_Here";

                XMLParser parser1 = new XMLParser();
                String xml = parser1.getXmlFromUrl(url); // getting XML

                XmlPullParserFactory factory = XmlPullParserFactory
                        .newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser parser = factory.newPullParser();

                parser.setInput(new StringReader(xml));

                int eventType = parser.getEventType();
                Model mModel = null;
                while (eventType != XmlPullParser.END_DOCUMENT) {

                    String name = null;
                    switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    case XmlPullParser.START_TAG:
                        name = parser.getName();
                        if (name.equalsIgnoreCase(PLACEMARK)) {
                            mModel = new Model();
                        } else if (mModel != null) {
                            if (name.equalsIgnoreCase(NAME)) {
                                mModel.setName(parser
                                        .nextText());
                            } else if (name.equalsIgnoreCase(DESCRIPTION)) {
                                mModel.setDescription(parser
                                        .nextText());
                            } else if (name.equalsIgnoreCase(COORDINATES)) {
                                mModel.setCoordinates(parser
                                        .nextText());
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        name = parser.getName();
                        if (name.equalsIgnoreCase(PLACEMARK)
                                && mModel != null) {

                            if (!mPlaceMarkSingleDriver.getName()
                                    .equalsIgnoreCase("null")) {
                                Constance.mArryList                                         .add(mModel);
                            }

                        }
                        break;
                    }
                    eventType = parser.next();
                }

            } catch (Exception e) {


                    progressDialog.dismiss();


            }

            return null;

        }

        @Override
        protected void onPostExecute(String result) {

            progressdialog.dismiss();
    }

// XmlParse 类

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class XMLParser {

    // constructor
    public XMLParser() {

    }

    /**
     * Getting XML from URL making HTTP request
     * @param url string
     * */
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }

    /**
     * Getting XML DOM element
     * @param XML string
     * */
    public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));
                doc = db.parse(is); 

            } catch (ParserConfigurationException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (IOException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            }

            return doc;
    }

    /** Getting node value
      * @param elem element
      */
     public final String getElementValue( Node elem ) {
         Node child;
         if( elem != null){
             if (elem.hasChildNodes()){
                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                     if( child.getNodeType() == Node.TEXT_NODE  ){
                         return child.getNodeValue();
                     }
                 }
             }
         }
         return "";
     }

     /**
      * Getting node value
      * @param Element node
      * @param key string
      * */
     public String getValue(Element item, String str) {     
            NodeList n = item.getElementsByTagName(str);        
            return this.getElementValue(n.item(0));
        }
}

【讨论】:

  • 如何添加参数假设我有两个参数,即用户名和密码。
【解决方案2】:

你没有在 while 循环中更新标记名试试这个:

while (eventType != XmlPullParser.END_DOCUMENT) {
    if (tagName.equalsIgnoreCase("cell")) {
        celda = xpp.nextText();
    } else if(tagName.equalsIgnoreCase("val")) {
        valor = xpp.nextText();
    }       
    xpp.nextTag();  
    tagname=xpp.getName();    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多