Bootstrap

DOM解析轻松入门(四)--DOM Level 3 Load and Save

 /*java and xml 3nd学习笔记
DOM解析轻松入门(四)--DOM Level 3 Load and Save
authors:shine
*/
DOM解析轻松入门(三)中大概讲解了DOM Levels,重点讲解了DOM Level 2 Modules中的Traversal和Range,这次我们就来看看DOM Level3:

Level 3:在Level2的基础上,增加了两个新的Module
a.DOM Level 3 Core (XML):提供了bootstrapping和InfoSet 机制(其中bookstrapping 后面有提,infoSet就是指在Document接口中加入了getXmlEncoding();getXmlStandalone();getXmlVersion();等控制XML Information的方法。)
b.DOM Level 3 Load & Save (LS):(顾名思义)
c.DOM Level 3 Validation (Validation):定义了根据DTD或Schema验证的接口。

由于一般的解析器只支持DOM Level 3 Core 和DOM Level 3 Load & Save (LS),所以Validation 就不浪费口水了。

DOM Level 3 Load & Save (LS):这个 Module是在org.w3c.dom.ls包中定义的。通过DOM Level3 Core中bootstrapping(自举机制)实现。

直接看例子:(这个例子实现了从test1.xml中解析内容,并写入到test2.xml文件中,其中做了schema验证)

1.先准备一个test1.xml

<?xml version="1.0" encoding="UTF-8"?>
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:/workplace/test1.xsd">
 <name>San Guo</name>
 <description>dddddddddd!</description>
</book>

2.再准备一个test1.xsd (用xmlSpy生成)
<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSpy v2007 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="name">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:enumeration value="San Guo"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:element>
 <xs:element name="description">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:enumeration value="dddddddddd!"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:element>
 <xs:element name="book">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="name"/>
    <xs:element ref="description"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

3.开始解析
package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.Document;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;

public class LSTest {
 public static void main(String[] args) {
  try {
   //bootstrapping(自举机制)获得LS Module支持
   String xmlURI = "D://workplace//test1.xml";
   DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
   //获得DOM指定DOM Module的解析器parserLS
   DOMImplementationLS lsImpl = (DOMImplementationLS) registry.getDOMImplementation("LS");
   LSParser parserLS = lsImpl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
   
   //配置解析器parserLS(做schema验证,如果不做schema验证就不用配DOMConfiguration)
   DOMConfiguration config = parserLS.getDomConfig();
   config.setParameter("validate", Boolean.TRUE);
   config.setParameter("schema-type", "http://www.w3.org/2001/XMLSchema");
   config.setParameter("schema-location", "D://workplace//test1.xsd");
   
   //配置输入源lsInput
   LSInput lsInput = lsImpl.createLSInput();
   lsInput.setCharacterStream(new FileReader(new File(xmlURI)));
   Document doc = parserLS.parse(lsInput);
   
   LSTest test = new LSTest();
   test.save(lsImpl, doc, "D://workplace//test2.xml");
   
  } catch (ClassCastException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 //LSSerializer 接口定义把内存中的XML写入文件
 public void save(DOMImplementationLS lsImpl,Document doc,String xmlURI) {
  LSSerializer serializer = lsImpl.createLSSerializer();
  LSOutput lsOutput = lsImpl.createLSOutput();
  try {
   lsOutput.setCharacterStream(new FileWriter(new File(xmlURI)));
   serializer.write(doc, lsOutput);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  
 }
}

4.注意:
如果在test1.xml中随便加入一个<a/>(即:不符合schema的元素),再run一下,控制台输出:
[Error] :4:6: cvc-complex-type.2.4.a: Invalid content was found starting with element 'a'. One of '{description}' is expected.
呵呵,是不是比SAX中的ErrorHandler方便多了,但是值得注意的是,即便有[error],但是</a>还是会写入到test2.xml中,不信去看看结果。

感言:
通过了DOM解析轻松入门(一)(二)(三)(四)4篇文章,终于把DOM解析中的常用知识点搞定了(累),接下来就是JAXP

/*
JAXP基础入门(一)2008-2-22
*/

;