用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.ParserConfigurationExcep tion;
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 (ParserConfigurationExcep tion 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对象进行的
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值