笔记总结:Java核心——XML解析

XML解析

一、XML

1.定义

Extensible Markup Language 可拓展标记语言

2.XML语法

a. 是一种文本文档,后缀名为.xml

b. 第一行行内容必须是对文档的声明,标签属性值必须使用单引号或者双引号

<?xml version="1.0" encoding="UTF-8”?>

c. 一个文档有且仅有一个根标签,标签必须严格闭合,标签区分大小写

<students>

​	<student name="张三" age="6" sex="男"></student>

​	<STUDENT>

​		<NAME>张三</NAME>

​		<AGE>20</AGE>

​		<SEX>男</SEX>

​	</STUDENT>

</students>	

d. 对于特殊符号(<)采用

<DES>

​	<![CDATA[

​		<

​	]]>

</DES>

CDATA标签中的内容会按原样展示

e. 标签自闭合

<student />

空元素可以使用自闭合标签

二、DTD约束

.dtd结尾文件

1. DTD约束元素

EMPTY空元素:元素可以不含任何数据,可以设置属性

#PCDATA(字符串):PCDATA表示被解析文本是字符串,不能包含其他元素,如子标签

ANY:任何内容

情景语法描述
顺序出现<!ELEMENT name (a,b)子元素a、b必须同时出现,且a必须在b之前出现
选择出现<!ELEMENT name(a|b)>子元素a、b只能有一个出现,要么是a,要么是b
只出现一次<!ELEMENT name (a)>子元素a只能且必须出现一次
一次或多次<!ELEMENT name (a+)>子元素a要么出现一次,要么出现多次
零次或多次<!ELEMENT name (a*)>子元素a可以出现任意次(包括不出现,即出现零次)
零次或一次<!ELEMENT name (a?)>子元素a可以出现一次或不出

格式:<!ELEMENT 元素名称 元素类型>

2. 引入DTD约束
<!DOCTYPE 根标签名 SYSTEM "约束文档名.dtd">

在xml文件引入dtd约束

3. DTD属性约束

属性值类型

CDATA:属性值为普通文本字符串。

Enumerated:属性值的类型是一组取值的列表,XML文件中设置的属性值只能是这个列表中的某一个值。 属性名(1|2|3)

ID:表示属性值必须唯一,且不能以数字开头。

属性值设置

#REQUIRED: 必须设置该属性。

#IMPLIED: 该属性可以设置也可以不设置。

#FIXED: 该属性的值为固定的。 属性名(固定常量)

不指明使用默认值

格式:<!ATTLIST 元素名 属性名 属性值类型 设置说明>

三、XML解析

1.解析方式

a. DOM解析

将XML文档一次性加载进内存,形成DOM树,优点是CRUD(增删改查)操作方便,缺点是占内存

b. SAX解析

将XML文档逐行读取,基于事件驱动,优点是不占内存,缺点是只能读取,不能CRUD

最优实现是Dom4j解析器

2.Dom4j解析
public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        //根据类的字节码对象找到xml文件并读取到流通道
        InputStream is = XmlParse.class.getResourceAsStream("test.xml");
        try {
            Document document = reader.read(is);
            //获取文档的根元素
            Element root = document.getRootElement();
            String tagName = root.getQualifiedName();
            System.out.println(tagName);
            /*List<Element> elements = root.elements();
            for(Element element : elements){
                String tag = element.getQualifiedName();
                System.out.println(tag);
                //获取元素的所有属性
                List<Attribute> attributes = element.attributes();
                for(Attribute attribute : attributes){
                    //获取属性名
                    String attrName = attribute.getName();
                    //获取属性值
                    String attrValue = attribute.getValue();
                    System.out.println(attrName + " " + attrValue);
                }*/
            Iterator<Element> iterator = root.elementIterator("student");
            while(iterator.hasNext()){
                Element element = iterator.next();
                String name = element.attributeValue("name");
                String sex = element.attributeValue("sex");
                String age = element.attributeValue("age");
                System.out.println(name + "\t" + sex + "\t" + age + "\t");
            }

        } catch (DocumentException ex) {
            throw new RuntimeException(ex);
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值