liuqiang5151

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 23 Stories :: 1 Comments :: 0 Trackbacks

在公司用到xml的地方很多,今天就总结一下两种最常见解析xml的方法。
DOM 简介:
DOM 对于 XML 的处理方式就是把整个 XML 读到内存中形成一棵树状结构,然后用各种方法对这棵数进行遍历、插入、删除、修剪等操作。因为 DOM 是 W3C 的正式标准,所有的语言都有支持 DOM 的解析器,包括 Java、C/C++、Perl、JavaScript 等等。DOM 的优点是信息量丰富(全部都在内存中),而且可以随机访问,尤其是在处理前后相互关联的元素时非常方便。DOM 的缺点是 XML 应用程序在处理 XML 之前必须先由 XML 解析器把整个 XML 读进内存并生成树状结构,如果 XML 非常大,例如 10M,解析的过程是非常慢的。如果再加上 XSLT 转换(这是一种必须要使用 DOM 的操作)这类同样耗费资源的操作,可能会耗尽系统的内存资源。所以标准 DOM 只适合于中小型 XML 的处理。

 

 1private static void writeXml(String path) {
 2        OutputStream os = null;
 3        XMLWriter writer = null;
 4        try {
 5            os = new FileOutputStream(path);
 6            Document doc = DocumentHelper.createDocument();
 7            // 设置根节点
 8            Element root = doc.addElement("root");
 9            // 加入一个子节点
10            Element sub = root.addElement("subRoot");
11            // 设置节点的对应的名字和值
12            sub.addAttribute("lq""yy");
13            // 这个boolean值设定xml显示的方式
14            OutputFormat format = new OutputFormat(""false);
15            writer = new XMLWriter(os, format);
16            writer.write(doc);
17        }
 catch(Exception e) {
18            
19        }

20    }

21    
22    private static void readXml(String path) throws UnsupportedEncodingException, FileNotFoundException {
23        InputStream is = null;
24        SAXReader saxReader = null;
25        try{
26            saxReader = new SAXReader();
27            is = new FileInputStream(path); // packing InputStream
28            Document document = saxReader.read(is);
29            // 获取根节点
30            Element root = document.getRootElement();
31            List ele = root.elements();
32            for (int i = 0; i < ele.size(); i++{
33                Element e = (Element) ele.get(i);
34                // 获取子节点
35                String name = e.getName();
36                // 获取名字和值
37                List ee = e.attributes();
38                for (int j = 0; j < ee.size(); j++{
39                    Node n = (Node) ee.get(i);
40                    n.getName();
41                    n.getText();
42                }

43            }

44        }
catch(DocumentException e){
45            //logger.debug("undoExtraInfo error" + e);
46        }

47    }


可以看到读取和写入特别方便,缺点就是把所有的节点都载入内存,有效率问题。

SAX 简介:
为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX。SAX 采用事件驱动的方式来处理 XML,它的处理方式是:为每一个元素、属性、内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供。解析器以数据流的方式读入 XML,当遇到某个元素、属性、内容时就调用相应的回调方法。SAX 的优点是处理效率高,适合处理大型 XML。缺点是 SAX 对 XML 是只读的,不能够对 XML 进行写操作,而且 SAX 处理 XML 中前后相互关联的元素时也没有 DOM 方便,因为应用程序必须自己保留以前事件的状态信息。但是 SAX 还是取得了巨大的成功,后来 SAX 还被移植到了 C++ 等语言中。

 1public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
 2        // TODO Auto-generated method stub
 3        SaxXmlTest sxt = new SaxXmlTest();
 4        String path = "c:\\test.xml";
 5        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
 6        SAXParser parser = parserFactory.newSAXParser();
 7        InputStream is = new FileInputStream(path); // packing InputStream
 8        parser.parse(is, sxt);
 9    }

10
11 // handle value
12    public void characters(char[] ch, int start, int length) throws SAXException {    
13        String str = new String(ch,start,length);
14        if(!str.startsWith("\n"&& !str.equals(" ")){  // wrap 
15            System.out.println(str);   //获取诸如<xml key="value">lq</xml>里的lq
16        }

17    }

18    //   handle document tail
19    public void endDocument() throws SAXException {     
20        System.out.println("******Document End********");
21    }

22    //   handle tag tail
23    public void endElement(String uri, String localName, String qName) throws SAXException {
24        
25    }

26    //   handle document head 
27    public void startDocument() throws SAXException 
28        System.out.println("******Start Document********");
29    }

30    //   handle tag head
31    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {    
32        if (qName.equals("subRoot")) {
33            for (int i=0;i<atts.getLength();i++{
34                System.out.println(atts.getQName(i) + " " 
35                        + atts.getValue(i));
36            }

37        }

38    }


public class SaxXmlTest extends DefaultHandler
注意一下 要继承DefaultHandler

这里不能介绍的那么全,在用的时候可以现去研究,里面的方法名也很容易看懂。
posted on 2008-04-11 18:02 刘强 阅读(619) 评论(0)  编辑  收藏 所属分类: java