XML解析技术和使用Jaxp对xml文档进行dom解析

来源:互联网 发布:crossfit slash知乎 编辑:程序博客网 时间:2024/05/17 05:11

用dom和sax对xml文档进行解析,可以使用已开发的xml解析开发包,我们直接调用即可。xml解析开发包有:Jaxp(最差)、Jdom(一般)、dom4j(最好)。

JAXP:
定义一个xml文档:

<?xml version="1.0" encoding="UTF-8"?><书架>    <>        <书名 name="xxxx">java就业培训课程</书名>        <作者>张孝祥</作者>        <售价>109元</售价>        <售价>39.00元</售价>    </>    <>        <书名>javaScript网页开发</书名>        <作者>张孝祥</作者>        <售价>109元</售价>        <售价>28.00元</售价>    </></书架>

Jaxp解析xml文档的代码:

package xml;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;public class Demo2 {    public static void main(String[] args) throws Exception {        //1、创建工厂        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();        //2、得到dom解析器        DocumentBuilder builder=factory.newDocumentBuilder();  //newDocumentBuilder()返回dom解析器        //3、解析xml文档,得到代表文档的document        Document document= builder.parse("src/xml/book.xml");    }}

这样会得到文档的document对象,再对这个对象进行操作即可。

例:

package xml;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;//使用dom方式对xml文档进行crudpublic class Demo3 {    //读取xml文档中:<书名>javaScript网页开发</书名>  节点中的值    @Test    public void read1() throws Exception{        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  //创建一个工厂        DocumentBuilder builder=factory.newDocumentBuilder();  //newDocumentBuilder()返回dom解析器,得到解析器        Document document= builder.parse("src/xml/book.xml");  //解析文档,拿到代表文档的document        NodeList list=document.getElementsByTagName("书名"); //根据标签名“书名”返回内容集合        Node node=list.item(1);  //下标从0开始,取第二个元素        String content=node.getTextContent();  //得到节点里的文本内容        System.out.println("read1:");        System.out.println(content);        System.out.println();    }    //得到xml文档中的所有节点(标签):使用递归,先得到根节点,再一层层往下找子节点    @Test    public void read2() throws Exception{        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  //创建一个工厂        DocumentBuilder builder=factory.newDocumentBuilder();  //newDocumentBuilder()返回dom解析器,得到解析器        Document document= builder.parse("src/xml/book.xml");  //解析文档,拿到代表文档的document        //得到根节点        Node root=document.getElementsByTagName("书架").item(0);  //因为只有一个根节点,集合中只有一个元素,直接.item(0)即可得到        System.out.println("read2:");        //得到根节点的孩子(递归方法)        list(root);        System.out.println();           }    private void list(Node node) {        if(node instanceof Element){  //判断node是不是标签,是标签才打印,否则打印结果会出现#text            System.out.println(node.getNodeName());  //打印得到的节点的名称        }        NodeList list=node.getChildNodes(); //得到所有孩子,返回一个集合        for(int i=0;i<list.getLength();i++){  //遍历这个集合            Node child=list.item(i);    //得到每一个孩子            list(child);    //迭代,得到孩子的孩子        }    }    //得到xml文档中标签属性的值:<书名 name="xxxx">java就业培训课程</书名>  即name的值    @Test    public void read3() throws Exception{        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  //创建一个工厂        DocumentBuilder builder=factory.newDocumentBuilder();  //newDocumentBuilder()返回dom解析器,得到解析器        Document document= builder.parse("src/xml/book.xml");  //解析文档,拿到代表文档的document        /*         * getAttributes()会得到节点的所有属性,必须要再进行一次遍历才行,这样较麻烦,         * 直接将bookname强制转换成Element(在已知的情况下才能转换)         * */        Element bookname=(Element) document.getElementsByTagName("书名").item(0); //得到第一个书名标签        String value=bookname.getAttribute("name");  //得到name属性的值        System.out.println("read3:");        System.out.println(value);    }}

运行结果:
这里写图片描述

0 0