Android中如何解析XML数据

来源:互联网 发布:数据丢失怎么恢复 编辑:程序博客网 时间:2024/05/25 23:28

在如今的Android的网络编程中,JSON数据解析和XML数据解析已经成为两个最主要的网络数据传输方式。本篇文章先来聊聊XML解析。

        XML在Android开发中非常重要,UI设计主要就是用XML进行编写,在此不再赘述。在Android的网络编程中,XML的目的主要是传输数据,而不是显示数据。并且XML没有预定义的标签,没有像HTML中的<p>,<h1>这样的标签,而是由开发者自己定义的。下面先来解析一段简单的XML:

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <languages>  
  3.     <lan id="1">  
  4.         <name>Java</name>  
  5.         <ide>Eclipse</ide>  
  6.     </lan>  
  7.     <lan id="2">  
  8.         <name>C++</name>  
  9.         <ide>Visual Studio</ide>  
  10.     </lan>  
  11. </languages>  

      我需要把每一个元素的id属性,name和ide解析出来。实现的代码如下:

[java] view plain copy
 print?
  1. try {  
  2.     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  3.     DocumentBuilder builder = factory.newDocumentBuilder();  
  4.     Document document = builder.parse(getAssets().open("languages.xml"));//我把需要解析的XML放到项目的assets文件夹下;一个XML文件相当于一个document;  
  5.     Element languages = document.getDocumentElement();//这是获取根目录,如languages ;这就是一个元素Element;方法getDocumentElement()就是获取xml的根目录;  
  6.     NodeList nodeList = languages.getElementsByTagName("lan");//getElementsByTagName()方法就是根据标签名称来获取一个元素下的其他元素;  
  7.   
  8.     for (int i = 0; i < nodeList.getLength(); i++) {//在一个TextView中进行显示;  
  9.         Element lan = (Element) nodeList.item(i);  
  10.         text.append(lan.getAttribute("id") + "  ");//获得每一个Element的属性;  
  11.         text.append(lan.getElementsByTagName("name").item(0).getTextContent() + "  ");//获得name元素值;  
  12.         text.append(lan.getElementsByTagName("ide").item(0).getTextContent() + "  ");//获得ide元素值;  
  13.         text.append("\n");//换行;  
  14.     }  
  15. catch (IOException e) {  
  16.     e.printStackTrace();  
  17. catch (ParserConfigurationException e) {  
  18.     e.printStackTrace();  
  19. catch (SAXException e) {  
  20.     e.printStackTrace();  
  21. }  

        这样解析xml的任务基本就完成了,但是在解析<lan>标签中的元素时,显得不是很聪明,如果元素太多,代码显得很冗余。下面使用两层for循环的实现。代码如下:

[java] view plain copy
 print?
  1. try {  
  2.            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  3.            DocumentBuilder builder = factory.newDocumentBuilder();  
  4.            Document document = builder.parse(getAssets().open("languages.xml"));  
  5.            Element languages = document.getDocumentElement();//这是获取根目录,如Languages;这就是一个元素Element;  
  6.            NodeList nodeList = languages.getElementsByTagName("lan");  
  7.   
  8.            for (int i = 0; i < nodeList.getLength(); i++) {  
  9.                Element lan = (Element) nodeList.item(i);  
  10.                text.append(lan.getAttribute("id") + "  ");//获得每一个Element的属性;  
  11.   
  12.                NodeList childNodes = lan.getChildNodes();//获取<lan>标签下的子元素,是一个节点列表;  
  13.                for (int j = 0; j < childNodes.getLength(); j++) {//根据子元素的数量进行遍历;  
  14.                    Node node = childNodes.item(j);//每一个子元素都是一个item,也可以理解为一个node;  
  15.                    if (node instanceof Element) {//判断这个node是否是一个Element元素,是的话进行打印;  
  16.                        text.append(node.getTextContent() + "  ");  
  17.                    }  
  18.                }  
  19.                text.append("\n");  
  20.            }  
  21.        } catch (IOException e) {  
  22.            e.printStackTrace();  
  23.        } catch (ParserConfigurationException e) {  
  24.            e.printStackTrace();  
  25.        } catch (SAXException e) {  
  26.            e.printStackTrace();  
  27.        }  

最后实现结果截屏如下:


。也能成功实现XML解析。


github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

     

0 0