Xml详解

介绍

是什么

XML 指可扩展标记语言(eXtensible Markup Language)

干什么

XML 被设计用来传输和存储数据.

XML 经常被用于充当配置文件.

特点

XML 指可扩展标记语言(EXtensible Markup Language)

XML 是一种很像HTML的标记语言

XML 的设计宗旨是传输数据,而不是显示数

XML 标签没有被预定义。您需要自行定义标签

XML 被设计为具有自我描述性

XML 和 HTML 之间的差异

XML 不是 HTML 的替代。

XML 和 HTML 为不同的目的而设计:

XML 被设计用来传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

语法

a) 声明信息, 用于描述 xml 的版本和编码方式

b) xml 有且仅有一个根元素

c) xml 是大小写敏感的

d) 标签是成对的, 而且要正确嵌套

e) 属性值要使用双引号

f)使用DTD或XSD定义约束

&lt; <     less than

&gt; >     greater than

&amp;    &    ampersand

&apos;   '      apostrophe

&quot;   "      quotation mark

注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

练习

使用XML描述下表中的学生成绩信息,XML文件定义为scores.xml

ID

姓名

课程

成绩

1

刘备

《三分天下》

66

2

曹操

《枭雄》

90

<?xml version="1.0" encoding="UTF-8"?>
<scores>
	<student id="1">
		<name>刘备</name>
		<course>《三分天下》</course>
		<score>66</score>
	</student>
	<student id="2">
		<name>曹操</name>
		<course>《枭雄》</course>
		<score>90</score>
	</student>
</scores>

DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD 可以分为两种, 内部 DTD, 外部 DTD

内部DTD

a)语法如下:

<!DOCTYPE 根元素 [元素声明]>

b) 元素声明语法:

<!ELEMENT 元素名 (子元素[, 子元素...])>

#PCDATA: (解析字符数据(PCDATA)是XML解析器解析的文本数据使用的一个术语。)

是说该标签内部不能再写标记,应该写普通文本

c) 数量词

+: 表示出现 1 次或多次, 至少一次

?: 表示出现 0 次或 1 次

*: 表示出现任意次

d) 属性声明语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

属性类型: CDATA, 表示字符数据(character data)

默认值:

#REQUIRED, 表示必须出现

#IMPLIED, 表示不是必须的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scores [
	<!ELEMENT scores (student+)>
	<!ELEMENT student (name,course,score)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT course (#PCDATA)>
	<!ELEMENT score (#PCDATA)>
	<!ATTLIST student id CDATA #REQUIRED>
]>
<scores>
	<student id="1">
		<name>刘备</name>
		<course>《三分天下》</course>
		<score>66</score>
	</student>
	<student id="2">
		<name>曹操</name>
		<course>《枭雄》</course>
		<score>90</score>
	</student>
</scores>

外部DTD

a) 创建一个独立的 dtd 文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>

b) 在 xml 中引入外部 DTD 文件

<!DOCTYPE root-element SYSTEM "filename">

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scores SYSTEM "scores.dtd">
<scores>
	<student id="1">
		<name>刘备</name>
		<course>《三分天下》</course>
		<score>66</score>
	</student>
	<student id="2">
		<name>曹操</name>
		<course>《枭雄》</course>
		<score>90</score>
	</student>
</scores>

Schema

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 可描述 XML 文档的结构。

XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。

优点:  比dtd 更能更加强大。 提供了更加丰富的数据类型。

    

    XML Schema 可针对未来的需求进行扩展

    XML Schema 更完善,功能更强大

    XML Schema 基于 XML 编写 (schema本质上就是一个 xml文件)

    XML Schema 支持数据类型 (提供的更加丰富的数据类型)

XML Schema 支持命名空间 

编写schema约束文件

schema约束文件的后缀名是.xsd,文件内只能有一个根节点,就是schema。

<?xml version="1.0" encoding="UTF-8"?>
<!--
    * 引入W3C的名称
        * 在根节点上,使用属性xmlns(xml namespace)
        * xmlns="http://www.w3.org/2001/XMLSchema"
        * 起名:targetNamespace    目标名称空间(起名)
            值是任意的:http://www.example.org/person
        * elementFormDefault    :
            * qualified(使用)   :质量好的
            * unqualified        :质量不好的
    * 定义元素
        * <element name="xx"></element>
        * 此处定义的name就是以后xml中的根标签名字
    * 判断是否是复杂还是简单的元素
        * 如果是简单    在element有属性    type="数据的类型"
        * 如果是复杂
            * 声明标签是复杂的元素    <complexType>
            * 子元素之间的关系
                        <sequence> 表明元素必须按照顺序出现。
                        <all> 元素的顺序可以任意。 但是元素出现的次数有且仅有一次。
                        <choice> 简单元素只能出现其中的一个,但是次数可以不限
    * 编写属性 (是要放在xml根标签中的属性)
        * <attribute name="xx" type="string" use="required" ></attribute>
            * name    属性名称
            * type     属性类型
            * use    属性约束,值
                    required 属性必须:
                    optional 可选择
                    prohibited 禁止的: 属性不能出现
 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/person"
        elementFormDefault="qualified">

    <element name="person">
        <complexType>
            <!-- <sequence> -->
            <!-- <all> -->
            <sequence>
                <!-- 简单元素:  -->
                <element name="name" type="string"></element>
                <element name="sex" type="string"></element>
                <element name="age" type="int"></element>
                <element name="address" type="string"></element>
            </sequence>
            <!--  </all> -->
            <!-- </sequence> -->

            <!-- 加入属性约束 -->
            <attribute name="id" type="int" use="required"></attribute>

            <attribute name="code" type="string" use="optional"></attribute>
        </complexType>
    </element>

    <!-- 下面可以定义多个<element>
        name不重复即可
        但是在xml中使用时,只能有一个根标签,即要么使用<person>,要么使用<student>
    -->
    <!--<element name="student"></element>-->
</schema>

使用schema约束文件

<?xml version="1.0" encoding="UTF-8"?>
<person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.example.org/person"
        xsi:schemaLocation="http://www.example.org/person person.xsd"
        id="21"
        code="sfas">
    <!--
        xsd文件中设置了<sequence>的话,下面的组件必须按照xsd中的顺序出现,且都出现
        xsd文件中设置了<all>的话,下面组件必须全部出现,但每个组件只能出现一次
        xsd文件中设置了<choice>的话,下面的组件只能出现一个,次数任意
    -->
    <name>张三</name>
    <sex>男</sex>
    <age>1</age>
    <address>郑州市</address>
</person>

XML解析

对 xml 文件进行操作, 包括创建 xml, 对 xml 文件进行增删改查操作.

常见的 xml 解析技术

DOM 解析 : 是官方提供的解析方式, 基于 xml 树解析的

SAX 解析 : 是民间的解析方式, 基于事件的解析

JDOM 解析 : 第三方提供, 开源免费的解析方式, 比 DOM 解析快

DOM4J解析 : 第三方提供, 开源免费, 是 JDOM 的升级版

DOM4J解析XML

需要导入 dom4j 的 jar 包, 解析 xml 的入口, 是需要先拿到一个 Document 对象

获得XML中数据

package com.zhiyou.xml;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;

/**
 * @author QiuShiju
 * @desc
 */
public class TestReadXML {

    public static void main(String[] args) throws DocumentException {
        // [1] 创建SAXReader对象, 用于读取xml文件
        SAXReader reader = new SAXReader();
        // [2] 读取xml文件, 得到Document对象
        Document doc = reader.read(new File("src/com/zhiyou/xml/scores2.xml"));
        // [3] 获取根元素
        Element root = doc.getRootElement();
        // [4] 获取根元素下所有子元素
        Iterator<?> it = root.elementIterator();
        while(it.hasNext()) {
            // 取出元素
            Element e = (Element) it.next();
            System.out.println(e.getName());
            // 获取id属性
            Attribute id = e.attribute("id");
            System.out.println(id.getName() + "=" + id.getValue());
            // 获取student的子元素
            Iterator<Element> iterator = e.elementIterator( );
            while (iterator.hasNext()){
                Element el = iterator.next( );
                System.out.println(el.getName()+ "=" + el.getStringValue());
            }
            //Element name = e.element("name");
            //Element course = e.element("course");
            //Element score = e.element("score");
            // 打印
            //System.out.println(name.getName()+ "=" + name.getStringValue());
            //System.out.println(course.getName() + "=" + course.getText());
            //System.out.println(score.getName() + "=" + score.getText());
            //System.out.println("--------------------------------------");
        }
    }
}

创建XML文件

package com.zhiyou.xml;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;

/**
 * @author QiuShiju
 * @desc
 */
public class TestCreatXML {
    public static void main(String[] args) throws Exception {
        // [1] 通过DocumentHelper生成一个Document对象
        Document doc = DocumentHelper.createDocument();
        // [2] 添加并得到根元素
        Element root = doc.addElement("books");
        // [3] 为根元素添加子元素
        Element book = root.addElement("book");
        // [4] 为book元素添加属性
        book.addAttribute("id", "b01");
        // [5] 为book添加子元素
        Element name = book.addElement("name");
        Element author = book.addElement("author");
        Element price = book.addElement("price");
        // [6] 为子元素添加文本
        name.addText("Thinking in Java");
        author.addText("小伟");
        price.addText("88");
         FileWriter fileWriter = new FileWriter(new File("src/book2.xml"));
        // [7.1] 输出:都在一行,格式不好
        // doc.write(fileWriter);
        // [7] 格式良好的输出
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(fileWriter, format);
        writer.write(doc);
        // [8] 关闭资源
        writer.close();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值