Fight With Me!!!

导航

用JDK自带的包来解析XML文件(DOM+xpath)

DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。

先来写一个xml文件(DTD文件请参阅XML DTD那篇博文):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "D:\workspace\XML\WebRoot\WEB-INF\book.dtd">
<book>
    <bookname name="XML详解" font="GB2312"></bookname>
    <authors>
        <author name="张孝祥" sex="男" age="45"></author>
        <author name="王勇" sex="男" age="35"></author>
        <author name="王波" sex="男" age="30"></author>
    </authors>
    <price value="¥55"></price>
    <publishdate>
        <value>2009-08-18</value>
    </publishdate>
</book>

 



再来写解析xml文件的java文件:

package com.xml.jdk;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XPathForXml {
        public void parseXMLWithJdk(){     
            try {
                //读取book.xml到内存
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder dbd = dbf.newDocumentBuilder();
                Document doc = dbd.parse(new FileInputStream("D:\\workspace\\XML\\WebRoot\\WEB-INF\\book.xml"));
               
                //通过XML获得book的authors的author子节点列表
                XPathFactory f = XPathFactory.newInstance();
                XPath path = f.newXPath();
                NodeList authors= (NodeList) path.uate("book/authors/author", doc,XPathConstants.NODESET);
                System.out.println(authors.getLength());
                //遍历取到的元素
                if(authors!=null){
                    for(int i=0;i<authors.getLength();i++){
                     Node author    = authors.item(i);
                     int n = i + 1;
                     System.out.print(n+".  名字:"+author.getNodeName());                       
                     System.out.println();
                    }
                }
               
                //获得book的authors的第一个子节点,注意NODESET和NODE的区别
                Node author= (Node) path.uate("book/authors/author", doc,XPathConstants.NODE);
                System.out.println("  名称:"+author.getNodeName());
                System.out.println("  内容:"+author.getTextContent());//如果存在内容则返回内容,不存在则返回空
                //获取节点的属性
                NamedNodeMap attr =  author.getAttributes();
                System.out.println("  该节点的属性个数"+attr.getLength());
                //遍历元素的属性
                if(attr!=null){
                    for(int i=0;i<attr.getLength();i++){
                        int n = i + 1;
                        System.out.print("   属性"+n+"   名称:"+attr.item(i).getNodeName());
                        System.out.print("   值:"+attr.item(i).getNodue());
                        System.out.print("   类型:"+attr.item(i).getNodeType());
                        System.out.println();
                    }
                }
               
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XPathExpressionException e) {
                e.printStackTrace();
            }  
        }
        public static void main(String[] args) {
            new XPathForXml().parseXMLWithJdk();
        }
}

 


下面对DOM读取XML的代码进行讲解:
(1)得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂

(2)从DOM工厂获得DOM解析器
DocumentBuilder dbd = domfac.newDocumentBuilder();
通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器

(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它

InputStream is=new FileInputStream("D:\\workspace\\XML\\WebRoot\\WEB-INF\\book.xml");
InputStream是一个接口。

(4)解析XML文档的输入流,得到一个Document

Document doc=dombuilder.parse(is);
由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的

posted on 2017-11-29 10:27  nickTimer  阅读(472)  评论(0编辑  收藏  举报