专栏首页Java技术分享xml解析技术概述和使用Jaxp对xml文档进行dom解析

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

用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文档进行crud
public 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);
    }
}

运行结果:

原文链接:http://blog.csdn.net/syf1970/article/details/51406960

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Knockout.js是什么?

    从本节开始介绍关于KnockoutJs相关的内容,本节主要介绍knockoutjs一些重要特性与优点,以及它与Jquery等框架库之间的区别。 1、Knocko...

    MonroeCode
  • Shiro 权限框架使用总结

    我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大...

    MonroeCode
  • 50道Java线程题

    线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。...

    MonroeCode
  • iOS开发笔记(十)— Xcode、UITabbar、特殊机型问题分析

    【问题分析】通过多个文件尝试,发现并非完全不能索引头文件,而是只能索引和当前文件在同级目录的头文件; 有点猜测是Xcode10.1的原因,但是在升级完的半年多...

    落影
  • [开源]一个简易的安卓浏览器

    夏时
  • hadoop集群篇--从0到1搭建hadoop集群

    本来有套好好的集群,可是不知道为什么虚拟机镜像文件损坏,结果导致集群不能用。所以不得不重新搭套集群,借此机会顺便再重新搭套吧,顺便提醒一句大家,自己虚拟机的集群...

    LhWorld哥陪你聊算法
  • 一个超乎想象的垃圾收集器:ZGC

    Z Garbage Collector,即ZGC,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:

    程序猿DD
  • java多线程加锁的简单处理办法 原

        当对数据修改时,如果两个线程同时去修改同一条数据,这样产生的结果就不是我们预期的结果。这时候就需要对修改操作进行加锁,让jvm里同一时刻只能有一个线程能...

    尚浩宇
  • MySQL之父解读数据库最新亮点

    本文是MySQL创始人Monty在5月30日"腾讯云CDB/CynosDB技术揭秘"系列直播中的分享实录。 ---- 大家好,我是MariaDB的 Micha...

    腾讯云数据库 TencentDB
  • CTF---密码学入门第七题 杯酒人生

    杯酒人生分值:10 来源: Veneno 难度:易 参与人数:2633人 Get Flag:790人 答题人数:963人 解题通过率:82% 使用古典密码 ...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券