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 条评论
登录 后参与评论

相关文章

来自专栏Java面试笔试题

Java中有几种类型的流?

字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在java.io 包中还有许多其他的流,主...

1082
来自专栏深度学习之tensorflow实战篇

Python正则表达式匹配各种标准形式整理

正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。 正则表达式链接网址 匹配中文字符的正则表达式: [\u4e0...

4304
来自专栏java闲聊

JDK8-Lambda表达式集合操作

public static List<Dish> toLists(){ return Arrays.asList( new...

963
来自专栏Ryan Miao

java8-Stream之数值流

在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。Java8...

2955
来自专栏应兆康的专栏

遇见 Kotlin 先导篇:Kotlin 相比 Java 好在哪里?

Kotlin 是一种为现代多平台应用而诞生的静态编程语言相比于Java而言,它有很多优点,待会笔者会就几个写一下,并给出实际例子。

4284
来自专栏技术小黑屋

Kotlin中常量的探究

在我们尝试使用Kotlin作为开发语言的时候,应该会想到在Kotlin中如何定义一个常量,就像Java中这样的代码一样

835
来自专栏C语言及其他语言

【优秀题解】问题 1113: C语言考试练习题_保留字母

斐波纳契数列 1,1,2,3,5,8,13,21,34,55,89……这个数列则称为“斐波纳契数列”,其中每个数字都是“斐波纳契数”。

1073
来自专栏Android群英传

Kotlin Primer·类与对象(上)

952
来自专栏个人随笔

Java 持久化操作之 --io流与序列化

1)File类操作文件的属性 1.File类的常用方法 ? 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路...

2959
来自专栏专注 Java 基础分享

Java 字节流操作

     在java中我们使用输入流来向一个字节序列对象中写入,使用输出流来向输出其内容。C语言中只使用一个File包处理一切文件操作,而在java中却有着...

2849

扫码关注云+社区

领取腾讯云代金券