使用Xerces-J的DOM方式进行XML程序设计

--使用方法


  1. 简介与背景知识
  2. Xerces对DOM的实现
  3. 如何使用
  4. 动态创建一个DOM树
  5. 使用XMLSerializer序列化DOM对象
  6. 使用DOM的程序的实例

在使用Xerces-J的DOM方式来进行XML文件的解析的时候,我们需要用到一个叫做DOMParser的类。和我们在上面曾经介绍过的SAXParser一样,这个类在org.apache.xerces.parsers包中。这个类中重要的方法如表8。

方法 使用说明
Document getDocument() 这个方法在完成解析之后调用,返回解析生成的Document对象
boolean getFeature(java.lang.String featureId) 这个方法用来获取Feature。
java.lang.String[] getFeaturesRecognized() 这个方法返回所有能够识别的Feature。
java.lang.String[] getPropertiesRecognized() 这个方法返回所有能够识别的property。
java.lang.Object getProperty(java.lang.String propertyId) 这个方法返回当前property的值。
void setFeature(java.lang.String featureId, boolean state) 这个方法设置一个Feature。
void setProperty(java.lang.String propertyId, java.lang.Object value)

这个方法设置一个Property。

void parse(InputSource source) 这个方法通过一个InputSource对象解析XML文档。
void parse(java.lang.String systemId) 通过文件名来解析XML文档。

使用DOMParser进行XML文档的基本过程可以分成三步。

  1. 创建一个DOMParser。
  2. 调用DOMParser的parse方法进行XML文档解析。
  3. 调用DOMParser的getDocument方法获取解析完毕的DOM文档对象树的根。

下面我们用一段简单的代码演示这三步过程。

try { DOMParser parser = new DOMParser(); parser.parse("test.xml"); Document DocRoot = parser.getDocument(); ... } catche(...) { ... }

下面我们用一个例子说明如何使用Xerces-J的DOM方式来进行XML文件的解析。这个例子同时还演示了如何进行序列化和如何遍历整个文档树以及如何动态创建并添加一个节点。在Windows98,JDK1.2,Jview环境下调试通过。

 

import java.io.*; import org.w3c.dom.*; import org.apache.xerces.dom.*; import org.apache.xerces.parsers.DOMParser; import org.xml.sax.InputSource; import org.apache.xml.serialize.XMLSerializer; import org.apache.xml.serialize.OutputFormat; public class TestXerces1 { DocumentImpl oDoc = null; int tabNum = 0 ; public static void main( String[] x) { new TestXerces1(); } public TestXerces1() { try { DOMParser parser = new DOMParser(); parser.setFeature( "http://apache.org/xml/features/dom/include-ignorable-whitespace", false ); parser.parse(new InputSource( new FileReader( new File( "testXerces.xml" )))); oDoc = ( DocumentImpl ) parser.getDocument(); put( oDoc); add(); put( oDoc); XMLSerializer oXSerializer = new XMLSerializer( System.out , new OutputFormat(oDoc , "GB2312" , true ) ); oXSerializer.serialize( oDoc ); Element oOne = oDoc.getElementById("111"); if( null == oOne) { System.out.println(" test1 was not found!"); } else { oXSerializer.serialize(oOne ); } } catch( Exception e ) { e.printStackTrace(); } } void put( NodeImpl __oPut ) { switch( __oPut.getNodeType() ) { case Node.DOCUMENT_NODE: { put( (ElementImpl)((Document)__oPut).getDocumentElement() ); break; } case Node.ELEMENT_NODE: { tabNum++; outTagName( __oPut.getNodeName()); NamedNodeMapImpl oAttrs = ( NamedNodeMapImpl ) __oPut.getAttributes(); for(int i = 0 ; i < oAttrs.getLength() ; i ++) { put( ( NodeImpl )oAttrs.item( i )); } NodeImpl oChild = (NodeImpl) __oPut.getChildNodes(); for( int i = 0 ; i < oChild.getLength() ; i ++ ) { put( ( NodeImpl )oChild.item( i ) ); } break; } case Node.TEXT_NODE: { tabNum++; outText( __oPut.getNodeValue() ); break; } case Node.ATTRIBUTE_NODE: { outAttr( __oPut.getNodeName(), __oPut.getNodeValue() ); tabNum++; } } tabNum--; } void add() { Element oAdd = oDoc.createElement("test3"); Text oText = oDoc.createTextNode("hello"); oAdd.appendChild( oText ); NodeImpl oNode = (NodeImpl)oDoc.getElementsByTagName("test2").item(0); oNode.appendChild( oAdd); } void outTagName( String __strTagName) { outString( "TagName:"+__strTagName); } void outString( String __strString ) { String strTab = new String(); for( int i = 0 ; i < tabNum ; i ++ ) { strTab +=" "; } System.out.println( "out:"+strTab+__strString); } void outText( String __strText ) { outString( " TEXT:"+__strText ); } void outAttr( String __strName, String __strValue) { outString( " ATTR:"+__strName+"="+__strValue ); } }

运行结果如图: