XML文件的创建和解析常用的主要有4种,下面以xml文件为例进行说明:
<?xml version="1.0" encoding="utf-8"?> <dict> <record> <row> <field name="dictname" value="Sex" describe="性别"></field> <field name="dictitem" value="0000"></field> </row> <row> <field name="dictname" value="Province" describe="省市"></field> <field name="dictitem" value="0001"></field> </row> </record> </dict>
1、Dom(Document Object Model)创建和解析XML文档:
描述:将整个xml文件解析成一个Dom树存放在内存中,然后通过程序去访问内存中的树信息。
优点:树存在内存中,操作上相对简单,可支持删除、修改和排序。
缺点:内存消耗大,硬件要求高。
Dom API解析XML的步骤:
A、扫描XML文件,获取输入流对象:
InputStream in = new FileInputStream(sFileName);
B、创建解析器对象:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
C、解析文件流,获得Document对象:
Document document = builder.parse(in);
D、根据获得的Document对象,获取节点信息。
代码实现请参考附件DomUtils.java
2、SAX(Simple API for XML)创建和解析XML文档:
描述:事件驱动,解析器发现元素开始、元素结束及文档的开始和结束时,会通知处理事件。我们只需要利用代码响应事件就可实现文档的处理。
优点:占用资源少(不需要加载整个文档),解析器代码小。
缺点:不持久,事件后没保存数据则数据丢失;无状态,事件只能得到文本,却不知文本所属元素。
SAX解析XML的步骤:
A、创建SAXParserFactory实例:
SAXParserFactory factory = SAXParserFactory.newInstance();
B、创建SAXParser实例;
C、创建SAXReader实例:
XmlReader reader = factory.newSAXParser().getXMLReader();
D、XMLReader加载XML,解析XML。
代码实现请参考附件SaxUtils.java。
3、Dom4j创建和解析XML文档:
描述:Dom4j具有丰富的Java XML API,拥有性能优异,功能强大(拥有本地的XPath支持),使用简单的特性。
Dom4j解析XML文件的步骤:
A、读取文件:
File file = new File(String sFileName);
B、创建XMLReader:
XMLReader reader = new XMLReader();
C、解析XML,获取Document:
Document document = reader.read(file);
D、解析文档Dom,获取节点及属性值。
代码实现请参考附件Dom4jUtils。
4、JDom创建和解析XML文档:
描述:20-80原则,大大减少了代码量。底层是使用SAX(最常用)、DOM、Xanan文档实现。
JDom解析XML文件的步骤:
A、创建解析器:
SAXBuilder builder = new SAXBuilder(false);
B、得到Document文档:
Document document = builder.build(xmlpath);
C、获取根节点:
Element root = document.getRootElemnet();
D、遍历获得节点信息:
root.getChildren();
代码实现请参考附件JDomUtils。
5、Apache Commons Degister解析XML:
描述:Degister由"事件"驱动,通过调用预定义的规则操作对象栈,将XML文件转换为Java对象。
原理:底层采用SAX解析XML,识别出特定XML元素(实际被细分为begin、body、end、finish四个时点),执行特定的动作(创建特定的Java对象,或调用特定对象的方法)。
XML元素根据匹配模式(matching pattern)识别,而相关操作由规则(rule)定义。转换过程中,Digester维持了一个对象栈,用来存放转换中生成的、或是为转换临时创建
的Java对象。对输入XML文件作了一趟完整的扫描后,对象栈的栈顶元素即为目标对象。
优点:Degister屏蔽了Sax的解析细节,仅关注解析本身,大大简化了转换操作。
注:工具类基本能满足所有的XML文档操作。