用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API (Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
当然还有很多其他的解析xml的jar,只说sun提供的接口!
使用DOM解析XML文档
我们现在来看看DOM是如何解析XML的吧!同样的,我将从一个简单的不能再简单的例子来说明DOM是如何解析XML文档的,先让我们看看XML是什么内容吧:
< ? xml version = "1.0" encoding = "UTF-8" ? > < books home= "8242954" tel= "13181805011" > < book email= "123@990.net" > < name id= "1" > java< / name> < price> 102< / price> < / book> < book email= "tian_bian_fei@163.com" > < name id= "2" > c+ + < / name> < price> 100< / price> < / book> < / books>
解析这个XML文件的Java代码 :
public static void main( String [ ] args) { // TODO Auto-generated method stub try { /* * DOM结点 DOM是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。DOM中最常见的节点类型有: * (1)元素: 元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点。 * (2)属性:属性节点包含关于元素节点的信息,但它不是元素的子节点 (3)文本:文本节点文本信息,或干脆是空白的文本。 * (4)文档:文档节点是整个文档中所有其它节点的父节点 元素是一种很重要的类型节点,元素节点可以是其他节点的容器。 */ // 得到DOM解析器的工厂实例 DocumentBuilderFactory domfac = DocumentBuilderFactory . newInstance ( ) ; // 从DOM工厂获得DOM解析器 DocumentBuilder dombuilder = domfac. newDocumentBuilder ( ) ; // 把要解析的XML文档转化为输入流,以便DOM解析器解析它 InputStream is = new FileInputStream ( "bin/java.xml" ) ; // 解析XML文档的输入流,得到一个Document Document doc = dombuilder. parse ( is) ; // 得到XML文档的根节点(books) Element root = doc . getDocumentElement ( ) ; // 获得根节点的所有属性名和值 if ( 0 < root. getAttributes ( ) . getLength ( ) ) { System . out. println ( "根节点属性信息.........." ) ; for ( int a = 0; a < root. getAttributes ( ) . getLength ( ) ; a+ + ) { System . out. println ( root. getAttributes ( ) . item ( a) . getNodeName ( ) + ":" + root. getAttributes ( ) . item ( a) . getNodeName ( ) ) ; } } // 得到根节点的子节点 NodeList books = root. getChildNodes ( ) ; for ( int i = 0; i < books. getLength ( ) ; i+ + ) { Node book = books. item ( i) ; // 判断是不是子节点 if ( book . getNodeType ( ) = = Node . ELEMENT_NODE) { // 获得子节点的所有属性名和值 if ( 0 < book . getAttributes ( ) . getLength ( ) ) { System . out. println ( "第" + i + "个子节点属性信息.........." ) ; for ( int b = 0; b < book . getAttributes ( ) . getLength ( ) ; b+ + ) { System . out. println ( book . getAttributes ( ) . item ( b) . getNodeName ( ) + ":" + book . getAttributes ( ) . item ( b) . getNodeValue ( ) ) ; } } //获得子节点的子节点 for ( int j = 0; j < book . getChildNodes ( ) . getLength ( ) ; j+ + ) { Node book1 = book . getChildNodes ( ) . item ( j) ; //System.out.println(book.getChildNodes().item(j)); // 判断是不是子节点 if ( book1. getNodeType ( ) = = Node . ELEMENT_NODE) { // 获得子节点的所有属性名和值 if ( 0 < book1. getAttributes ( ) . getLength ( ) ) { System . out. println ( " 第" + i + "个子节点的第" + j + "子节点的属性信息.........." ) ; for ( int b1 = 0; b1 < book1. getAttributes ( ) . getLength ( ) ; b1+ + ) { System . out. println ( book1. getAttributes ( ) . item ( b1) . getNodeName ( ) + ":" + book1. getAttributes ( ) . item ( b1) . getNodeValue ( ) ) ; } } System . out. println ( book1. getNodeName ( ) + ":" + book1. getFirstChild ( ) . getNodeValue ( ) ) ; } } } } } catch ( Exception e) { e. printStackTrace ( ) ; } }