zoukankan      html  css  js  c++  java
  • 用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:workspaceXMLWebRootWEB-INFook.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对象进行的

  • 相关阅读:
    个人冲刺(八)
    记账本典型用户和使用场景分析
    第九周进度总结
    个人冲刺(七)
    解密微信sqlite数据库
    读取文件内容时,显示的内容明显少于文本长度
    sqlcipher 数据库解密
    Win7系统的虚拟机中安装win7系统
    NSIS笔记
    vector list map set等容器某些函数的使用区别
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/7918909.html
Copyright © 2011-2022 走看看