在公司用到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 的处理。
1
private 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++ 等语言中。
1
public 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
这里不能介绍的那么全,在用的时候可以现去研究,里面的方法名也很容易看懂。