Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434626
  • 博文数量: 125
  • 博客积分: 2066
  • 博客等级: 大尉
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-16 14:06
文章分类

全部博文(125)

文章存档

2011年(125)

分类:

2011-06-21 21:51:03

DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。

但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

下面是一个使用DOM解析xml的例子:

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;

  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;

  9. import org.w3c.dom.Document;
  10. import org.w3c.dom.Element;
  11. import org.w3c.dom.Node;
  12. import org.w3c.dom.NodeList;

  13. public class DOM_XML_Parser {

  14.     /**
  15.      * @param args
  16.      */
  17.     public static void main(String[] args) {
  18.         File file = new File("C:/studentInfo.xml");
  19.         try {
  20.             List<Person> personList = readXML(new FileInputStream(file));
  21.             if(personList != null) {
  22.                 for(Person p : personList) {
  23.                     System.out.println(p);
  24.                 }
  25.             } else {
  26.                 System.out.println("list null");
  27.             }
  28.         } catch (FileNotFoundException e) {
  29.             e.printStackTrace();
  30.         }
  31.     }
  32.     
  33.     public static List<Person> readXML(InputStream inStream) {
  34.         List<Person> persons = new ArrayList<Person>();
  35.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  36.         try {
  37.             DocumentBuilder builder = factory.newDocumentBuilder();
  38.             Document dom = builder.parse(inStream);
  39.             Element root = dom.getDocumentElement();
  40.             NodeList personNodes = root.getElementsByTagName("person");//查找所有person节点
  41.             for (int i = 0; i < personNodes.getLength(); i++) {
  42.                 Person person = new Person();
  43.                 //得到第一个person节点
  44.                 Element personNode = (Element) personNodes.item(i);
  45.                 //获取person节点的id属性值
  46.                 person.id = (new Integer(personNode.getAttribute("id")));
  47.                 
  48.                 //获取person节点下的所有子节点(标签之间的空白节点和name/age元素)
  49.                 NodeList childsNodes = personNode.getChildNodes();
  50.                 for (int j = 0; j < childsNodes.getLength(); j++) {
  51.                     Node node = (Node) childsNodes.item(j);            
  52.                     //判断是否为元素类型
  53.                     if(node.getNodeType() == Node.ELEMENT_NODE){                    
  54.                         Element childNode = (Element) node;
  55.          //判断是否name元素
  56.                      if ("name".equals(childNode.getNodeName())) {
  57.                          //获取name元素下Text节点,然后从Text节点获取数据                 
  58.                          person.name = (childNode.getFirstChild().getNodeValue());
  59.                      } else if ("age".equals(childNode.getNodeName())) {
  60.                          person.age = (new Short(childNode.getFirstChild().getNodeValue()));
  61.                      }
  62.                     }
  63.              }
  64.              persons.add(person);
  65.             }
  66.             inStream.close();
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.         return persons;
  71.     }
  72. }

输出结果是:
id=23 name=LiMing age=30
id=20 name=XiaoZhang age=25


需要解析的XML文件如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persons>
  3.     <person id="23">
  4.         <name>LiMing</name>
  5.         <age>30</age>
  6.     </person>
  7.     <person id="20">
  8.         <name>XiaoZhang</name>
  9.         <age>25</age>
  10.     </person>
  11. </persons>
阅读(1829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~