Java解析XML的四种方式 详解

了解XML

什么是XML?

       XML是Extensibe Markup Language的缩写,即可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据。

XML的结构

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90">
            <Item>
                <title>标题信息</title>
                <link>链接信息</link>
                <pubDate>20xx-xx-xx</pubDate>
            </Item>
        </Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
    
</PhoneInfo>
1,XML的声明

       <?xml version="1.0" encoding="utf-8" standalone="no"?>表示XML的声明,用来标明此文件是一个XML文档。其中的version表示文档符合XML1.0规范;encoding表示文档字符集编码,默认为“UTF-8”;standalone表示该文件是否呼叫其它外部的文件。若值是 ”yes” 表示没有呼叫外部文件,若值是 ”no” 则表示有呼叫外部文件。默认值是 “yes”。
       对于每一个xml文档,声明部分都是一样的。

2,标签

       在XML 中,使用<>括起来的各种标签来标记数据。如:<author>作者</author>
       注意:HTML中的标签都是固定的,不能自己随意写,而XML中标签可以直接写。

3,元素

       元素是XML文档中的主要部分。如:<title>标题信息</title>是一个元素。元素由三部分组成:开始标签、结束标签、元素内容。元素的命名规则如下:
       1,名称中可以包含字母、数字或其他的字符。
       2,名称中不能以数字或者标点符号开始。
       3,名称不能以“xml”(Xml或XML)开始。
       4,名称中不能包含空格。

4,根元素

       每个XML文档必须有且仅有一个根元素。如:<PhoneInfo></PhoneInfo>
       根元素的特点如下:
       1,根元素是一个完全包含文档中国其他所有元素的元素。
       2,根元素的起始标签要放在所有其他元素的起始标签之前。
       3,根元素的结束标签要放在所有其他元素的结束标签之后。

5,属性

       如上面的XML文档中,<Brand name="华为"></Brand>中的“name”就是属性,用来描述手机的品牌名称。属性使用双引号包裹的。

解析XML的概述

       目前解析XML文档有四种方式。
       1,DOM:
       DOM 是基于XML的树状结构来完成解析的,DOM解析XML时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用DOM API来操作这个树结构。DOM解析适用于多次访问XML的程序,一次性加载完,但是DOM解析比较浪费资源。
       2,SAX:
       SAX是基于事件的解析,它是为了解决DOM 解析的资源消耗而出现的。SAX解析边读边加载,占用资源少。
       3,JDOM:
       DOM是不针对语言的,而JDOM是这对Java的特定文档模型,它简化了与XML的交互并且使用DOM 更快。JDOM优势在于:使用20%的精力解决80%的Java问题。
       4,DOM4J:
       DOM4J是一个非常优秀的JavaXML API,具有性能优异,功能强大和易用的特点,

DOM解析XML文档

       使用DOM解析XML文档的步骤如下:
       1,创建解析器工厂对象,即:DocumentBuilderFactory对象。
       2,由解析器工厂对象创建解析器对象,即DocumentBuilder对象。
       3,由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象。
       4,以Document对象为起点对DOM树的节点进行增加、删除、修改、查询等操作。

package cn.test;

import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import java.io.IOException;

public class Test1 {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        //得到DOM解析器的工厂实例
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //从DOM工厂得到DOM解析器
        DocumentBuilder db=dbf.newDocumentBuilder();
        //解析XML文档,得到一个Document对象,即DOM树
        Document doc=db.parse("src\\phone.xml");
        //得到所有的Brand节点列表信息
        NodeList brandList = doc.getElementsByTagName("Brand");
        //循环Brand信息
        for(int i=0;i<brandList.getLength();i++){
            //获取第i个元素,并且转化为Element元素
            Element element=(Element) brandList.item(i);
            //拿到第i个Brand元素的name属性值
            String attrValue=element.getAttribute("name");
            //获取当前元素的所有的Type元素
            NodeList types=element.getElementsByTagName("Type");
            for(int j=0;j<types.getLength();j++){
                //先拿到子元素的节点
                Element element1 = (Element)types.item(j);
                String typeName =(element1.getAttribute("name"));
                System.out.println("手机型号是:"+typeName);
            }
        }
    }
}

       运行结果如下:

手机型号是:P90
手机型号是:iPhone Z
手机型号是:iPhone ZL

       使用DOM解析常用到的对象有:Node对象,NodeList对象,Document对象,Element对象。
       Node对象:是DOM结构中最基本的对象,代表了文档树中的一个抽象节点。实际使用中很少使用Node对象,一般都是使用ELement对象。

方法名作用
getChildNodes()返回包含此节点所有子节点的NodeList。
getFirstChild()如果节点存在子节点,则返回第一个子节点
getLastChild()如果节点存在子节点,则返回最后一个子节点
getNextSibling()返回在DOM树中这个节点的下一个兄弟节点
getPreviousSibling()返回在DOM树中这个节点的上一个兄弟节点
getNodeName()返回节点的名称
getNodeValue()返回节点的值
getNodeType()返回节点的类型

       NodeList对象:指包含了一个或者多个节点(Node)的列表。

方法名作业
getLength()返回列表的长度
item(int index)返回指定位置的Node对象

       Document对象:代表整个XML文档。

方法作用
getElementByTagName(String name)返回一个NnodeList对象,它包含了所有给定名称标签的标签
getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的对象

       Element对象:代表XML文档中年的标签元素,继承自Node,也是Node最主要的子对象。

方法作用
getAttribute(String attributename)返回标签中给定属性名称的属性的值
getElementsByTagName(String name)返回具有给定标签名称的所有后代Element的NodeList

       

DOM4J解析XML文档

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦梦~~

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值