在Android上解析XML

问题描述 投票:1回答:3

我试图在Android应用程序中使用API​​作为我们的计费系统,但我无法弄清楚如何解析它返回的XML。这是我的功能到目前为止的样子......

public void ParseData(String xmlData)
{
    try
    {
        // Document Builder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = factory.newDocumentBuilder();

        // Input Stream
        InputSource inStream = new InputSource();
        inStream.setCharacterStream(new StringReader(xmlData));

        // Parse Document into a NodeList
        Document doc = db.parse(inStream);
        NodeList nodes = doc.getElementsByTagName("ticket");

        // Loop NodeList and Retrieve Element Data
        for(int i = 0; i < nodes.getLength(); i++)
        {
            Node node = nodes.item(i);

            if (node instanceof Element)
            {
                Element child = (Element)node;
                String id = child.getAttribute("id");
            }
        }
    }
    catch(SAXException e)
    {

    }
}

这是返回的XML数据的样子。我需要循环遍历每个元素并拉出每个元素,但我无法弄清楚如何使用DOM解析器。

<whmcsapi> 
 <action>gettickets</action> 
 <result>success</result> 
 <totalresults>1</totalresults> 
 <startnumber>0</startnumber> 
 <numreturned>1</numreturned> 
 <tickets> 
  <ticket> 
   <id>1</id> 
   <tid>557168</tid> 
   <deptid>1</deptid> 
   <userid>1</userid> 
   <name><![CDATA[Array]]></name> 
   <email></email> 
   <cc></cc> 
   <c>TmDEga5v</c> 
   <date>2009-08-03 23:14:32</date> 
   <subject><![CDATA[Test Ticket]]></subject> 
   <message><![CDATA[This is a test ticket> 

   ---------------------------- 
   IP Address: xxx.xxx.xxx.xxx]]></message> 
   <status>Open</status> 
   <priority>Medium</priority> 
   <admin></admin> 
   <attachment></attachment> 
   <lastreply>2009-08-04 12:14:18</lastreply> 
   <flag>0</flag> 
   <service></service> 
  </ticket> 
 </tickets> 
</whmcsapi>
android xml dom xml-parsing
3个回答
0
投票

是的SAX解析器是解决方案,这是让您入门的基本代码:

void parseExampleFunction(){
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xr = sp.getXMLReader();

    File myFile = new File( //the XML file which you need to parse );
    myFile.createNewFile();

    FileInputStream fOut =  new FileInputStream(myFile);
    BufferedInputStream bos = new BufferedInputStream( fOut );

    /** Create handler to handle XML Tags ( extends DefaultHandler ) */

    MessagesXMLHandler myXMLHandler = new MessagesXMLHandler(context);
    xr.setContentHandler(myXMLHandler);
    xr.parse(new InputSource(bos));
}

// the class where the parsing logic needs to defined.This preferably can be in a different .java file 
public class MessagesXMLHandler extends DefaultHandler{

    //this function is called automatically when a start tag is encountered
    @Override
    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException 
    //variable localName is the name of the tag

    //this function is called autiomatically when an end tag is encountered
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
    }

    //this function gets called to return the value stored betweeen the closing and opening tags
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //now variable value has the value stored between the closing and opening tags
        String value=new String(ch,start,length);
    }
}

0
投票

对于android最好的方法解析xml就是使用SAXParser。我用演示解释了它......

首先创建您的活动类,如下所示。

public class ActivityForSax extends ListActivity {
private ProgressDialog pDialog;
private ItemXMLHandler myXMLHandler;
private String rssFeed = "https://www.dropbox.com/s/t4o5wo6gdcnhgj8/imagelistview.xml?dl=1";
private TextView textview;
private ListView mListView;
private ArrayList<HashMap<String, String>> menuItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.xml_dom);

    textview = (TextView)findViewById(R.id.textView1);
    doParsing();

    mListView = getListView();
}

public void doParsing(){

    if (isNetworkAvailable()) {
        textview.setText("Loading...Please wait...");
        new AsyncData().execute(rssFeed);
    } else {
        showToast("No Network Connection!!!");
    }   
}
class AsyncData extends AsyncTask<String, Void, Void> {

    @Override
    protected void onPreExecute() {
        menuItems = new ArrayList<HashMap<String, String>>();
        pDialog = new ProgressDialog(ActivityForSax.this);
        pDialog.setTitle("Loading....");
        pDialog.setMessage("Please wait...");
        pDialog.show();
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(String... params) {

        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            myXMLHandler = new ItemXMLHandler();
            xr.setContentHandler(myXMLHandler);

            URL _url = new URL(params[0]);

            xr.parse(new InputSource(_url.openStream()));

        } catch (ParserConfigurationException pce) {
            Log.e("SAX XML", "sax parse error", pce);
        } catch (SAXException se) {
            Log.e("SAX XML", "sax error", se);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        textview.setText("Done!!!");
        if (pDialog != null && pDialog.isShowing()) {
            pDialog.dismiss();
        }

        ArrayList<Bean> itemsList = myXMLHandler.getItemsList();

        for (int i = 0; i < itemsList.size(); i++) {
            Bean objBean = itemsList.get(i);
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            // adding each child node to HashMap key => value
            map.put("TITLE :: ", objBean.getTitle());
            map.put("DESC :: ", objBean.getDesc());
            map.put("PUBDATE :: ", objBean.getPubDate());

            // adding HashList to ArrayList
            menuItems.add(map);
        }

        // Adding menuItems to ListView
        ListAdapter adapter = new SimpleAdapter(ActivityForSax.this, menuItems,
                R.layout.list_item,
                new String[] { "TITLE :: ", "DESC :: ", "PUBDATE :: " }, new int[] {
                R.id.name, R.id.email, R.id.mobile });

        mListView.setAdapter(adapter);

    }
}

public void showToast(String msg) {
    Toast.makeText(ActivityForSax.this, msg, Toast.LENGTH_LONG).show();
}

public boolean isNetworkAvailable() {
    ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity == null) {
        return false;
    } else {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;
}
}

现在您需要创建用于解析xml数据的默认处理程序类。

public class ItemXMLHandler extends DefaultHandler {

Boolean currentElement = false;
String currentValue = "";
Bean item = null;
private ArrayList<Bean> itemsList = new ArrayList<Bean>();

public ArrayList<Bean> getItemsList() {
    return itemsList;
}

// Called when tag starts
@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    currentElement = true;
    currentValue = "";

    if (localName.equals("item")) {
        item = new Bean();
    }

}

// Called when tag closing
@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {

    currentElement = false;

    if (localName.equals("id")) {
        item.setId(currentValue);
    } else if (localName.equals("title")) {
        item.setTitle(currentValue);
    } else if (localName.equals("desc")) {
        item.setDesc(currentValue);
    } else if (localName.equals("pubDate")) {
        item.setPubDate(currentValue);
    } else if (localName.equals("link")) {
        item.setLink(currentValue);
    } else if (localName.equals("item")) {
        itemsList.add(item);
    }
}

// Called to get tag characters
@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {

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

最后你的Bean类就像......

public class Bean {

private String id;
private String title;
private String desc;
private String pubDate;
private String link;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

public String getPubDate() {
    return pubDate;
}

public void setPubDate(String pubDate) {
    this.pubDate = pubDate;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}
}

0
投票
  1. 在库文件夹中添加java-json.jar
  2. 编译文件('libs/java-json.jar')//将此行添加到您的构建中

以下是将xml响应转换为json响应的代码:

JSONObject jsonObj = null;
try {
        jsonObj = XML.toJSONObject(response.toString());
} catch (JSONException e) {
        Log.e("JSON exception", e.getMessage());
        e.printStackTrace();
}
© www.soinside.com 2019 - 2024. All rights reserved.