javaSE基础之XML

课程笔记Day21

  • XML

第一章 XML

第01节 基础理论

XML是什么?

XML 是一种标记型语言。 由标签组成的。(例如:html他是标记型语言,由标签组成)

HTML和XML 有什么区别呢?
	(1)HTML的标签是预定义的,XML的标签是自定义的。
	(2)HTML用于展示数据,XML用于存储和传输数据。

快速入门

<?xml version="1.0" encoding="utf-8" ?>
<跟标签>
    <一级子标签1>
        <二级子标签1 属性名称1="属性值1">
            文本1
        </二级子标签1>
        <二级子标签2 属性名称2="属性值2">
            文本2
        </二级子标签2>
    </一级子标签1>
    <一级子标签2>
        <二级子标签1>
            文本1
        </二级子标签1>
    </一级子标签2>
</跟标签>

案例代码

<?xml version="1.0" encoding="UTF-8" ?>
<lol>
    <hero id="1">
        <name>
            亚瑟
        </name>
        <age>
            24
        </age>
    </hero>
    <hero id="2">
        <name>
            妲己
        </name>
        <age>
            20
        </age>
    </hero>
</lol>
第02节 基础语法

基本规则

1. XML文件的后缀必须都是xml
2. XML第一行必须写文档声明
3. XML中有且仅有一个根标签
4. 属性值必须使用引号,单引号、双引号都可以
5. 标签必须正确关闭,要么成对标签,要么自闭合
6. XML区分大小写

常规语法

注释怎么写?

<!-- 这是注释 -->

转义字符

在 XML 当中,有些语法会和标签规定的语法出现冲突的情况,这种情况下就需要使用转义字符。
例如: <>  如果我们就像写 尖括号的形式怎么办呢?
显示结果描述转义字符
空格&nbsp;
<小于号&lt;
>大于号&gt;
&与号&amp;
"双引号&quot;
单引号&apos;
×乘号&times;
÷除号&divde;
<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book id="&quot;001&quot;">
        <name> &lt;&lt;西游记&gt;&gt; </name>
        <author>作者:'吴承恩'</author>
        <description>
            <![CDATA[
                    我在这,想写什么都可以的,不一定要写标准代码。
                    <<嘻嘻,我是西游记>>
                    Sys.out.println("西游记讲的是两个和尚和三个动物的故事");

            ]]>
        </description>
    </book>

</books>

注意事项:XML当中标签是 包裹嵌套,不能写 交叉嵌套。

在这里插入图片描述

第03节 展示数据

用法

可以给 XML 引入css样式,用于数据的展示。

语法:
	<?xml-stylesheet type="text/css" href="css文件的路径" ?>

例如

css文件

@CHARSET "utf-8";
name{
    color: red;
}

xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="test.css" ?>

<books>
    <book>
        <name> 西游记 </name>
        <author>吴承恩</author>
    </book>
    <book>
        <name> 水浒传 </name>
        <author>施耐庵</author>
    </book>
    <book>
        <name> 红楼梦 </name>
        <author>曹雪芹 高鹗</author>
    </book>
    <book>
        <name> 三国演义 </name>
        <author>罗贯中</author>
    </book>
</books>
第04节 约束介绍

理论

我们知道 XML 的标签是自定义的。你想写什么,就可以写什么,只要符合标识符的规范就可以了。
但是很多情况下,我们要求 xml 的标签,不能随便写,这种情况下,就需要使用 xml的约束了。

例如: 在properties当中规定说: 用户名的键必须叫做 username 不能写别的,否则无法识别。
但是在 xml 当中,因为名字的太不规范了,所以为了规范要求,根据现实需求,就需要添加约束信息。

DTD约束

快速入门(内部引用)

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    DTD约束的内部引用方式
    内部引用:在XML文件内部,引入DTD的语法标准
    <!DOCTYPE note[   表示说:根标签的名字是 node
    <!ELEMENT node (to,form,heading,body,foot)> 表示说:在node里面,包含有 to,from,heading,body,foot 必须按照这个顺序
    <!ELEMENT to (#PCDATA)>  表示说: to 他是一个简单标签,里面只能写文本。(#PCDATA) 表示文本的意思
-->
<!DOCTYPE node [
        <!ELEMENT node (to,form,heading,body,foot)>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT form (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>
        <!ELEMENT foot (hello,world)>
        <!ELEMENT hello (#PCDATA)>
        <!ELEMENT world (#PCDATA)>
        ]>

<node>
    <to></to>
    <form></form>
    <heading></heading>
    <body></body>
    <foot>
        <hello>你好</hello>
        <world>世界</world>
    </foot>
</node>

DTD标签个数的问题

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    <!ELEMENT books (book*)>
    表示的含义是: 在 books 里面包含 book
    包含多少个呢?
    如果是 + 表示1个或者N个
    如果是 * 表示0个或者N个
-->
<!DOCTYPE books [
        <!ELEMENT books (book*)>
        <!ELEMENT book (name,author)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        ]>
 <books>
    <book>
        <name>西游记</name>
        <author>吴承恩</author>
    </book>
    <book>
        <name>水浒传</name>
        <author>施耐庵</author>
    </book>
</books>

外部引入的写法

dtd文件

<!DOCTYPE books [
        <!ELEMENT books (book*)>
        <!ELEMENT book (name,author)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        ]>

xml文件

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

<!--
    引入外部 DTD的写法
-->
<!DOCTYPE books SYSTEM  "hello.dtd">
<books>
    <book>
        <name>西游记</name>
        <author>吴承恩</author>
    </book>
</books>

引入网络当中的DTD约束

网络DTD <!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件的位置URL" >

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

Schema约束

快速入门

world.xsd 文件

<?xml version="1.0" encoding="UTF-8" ?>
<dinghao:schema
        xmlns:dinghao="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://guolong.com"
        xmlns="http://guolong.com"
        elementFormDefault="qualified"
        >

    <!-- 根标签,标签的名称是 note -->
    <dinghao:element name="note">
        <!-- complexType 表示当前的 note是一个复杂元素 -->
        <dinghao:complexType>
            <!-- sequence 顺序:表示里面的标签内容有先后顺序 -->
            <dinghao:sequence>
                <!-- 简单元素的写法 -->
                <dinghao:element name="to" type="dinghao:string" />
                <dinghao:element name="form" type="dinghao:string" />
                <dinghao:element name="heading" type="dinghao:string" />
                <dinghao:element name="body" type="dinghao:string" />
            </dinghao:sequence>
        </dinghao:complexType>
    </dinghao:element>
</dinghao:schema>

xml文件

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

<note
    xmlns="http://guolong.com"
    xmlns:xufeng="http://www.w3.org/2001/XMLSchema-instance"
    xufeng:schemaLocation="http://guolong.com  world.xsd"
    >

    <to>到哪里去</to>
    <form>从哪里来</form>
    <heading></heading>
    <body>身体</body>

</note>

练习案例

xml文件

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

<学生分类 xmlns="http://yanpeng.com">
    <学生>
        <姓名>定浩</姓名>
        <年龄>18</年龄>
    </学生>
    <学生>
        <姓名>郭龙</姓名>
        <年龄>19</年龄>
    </学生>
    <学生>
        <姓名>腚耗</姓名>
        <年龄>16</年龄>
    </学生>
</学生分类>

schema文件,文件名称是 student.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<huangjie:schema
        xmlns:huangjie="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://yanpeng.com"
        xmlns="http://yanpeng.com"
        elementFormDefault="qualified"
        >

    <!-- 根标签 -->
    <huangjie:element name="学生分类">
        <!-- 根标签是一个复杂类型的 -->
        <huangjie:complexType>
            <huangjie:sequence>
                <!-- 指定子标签 学生 minOccurs 至少有1个,maxOccurs 最多多少个 -->
                <huangjie:element name="学生" minOccurs="1" maxOccurs="unbounded">
                    <!-- 学生是一个复杂类型的 -->
                    <huangjie:complexType>
                        <huangjie:sequence>
                            <huangjie:element name="姓名" type="huangjie:string"/>
                            <huangjie:element name="年龄" type="huangjie:integer"/>
                        </huangjie:sequence>
                    </huangjie:complexType>
                </huangjie:element>
            </huangjie:sequence>
        </huangjie:complexType>
    </huangjie:element>

</huangjie:schema>
第05节 XML解析

基础理论

什么是解析

解析就是将 字符串变成对象的过程。
理解:将XML文件,整体看做一个字符串,通过特殊的手段去获取到里面的数据,封装成为对象。

理解XML的组成部分。

在这里插入图片描述

快速入门

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

import java.io.File;
import java.util.List;

//目标:学习Dom4j的快速入门
public class Test01 {

    public static void main(String[] args) throws Exception {

        //1.想办法获取到 Document的对象
        String path = "JavaSEDay21\\dir\\12_理解组成部分.xml";
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File(path));

        //2.根标签
        Element rootElement = doc.getRootElement();

        //3.获取子标签
        List<Element> elements = rootElement.elements();
        //4.循环遍历子标签
        for (Element hero : elements) {
            //获取到属性的文本
            String id = hero.attribute("id").getText();
            //获取到元素的文本
            String name = hero.element("name").getText();
            String age = hero.element("age").getText();
            //展示结果
            System.out.println(id + "," + name + "," + age);
        }
    }
}

Xpath解析(基于Dom解析)

理论

专门用来解决,层次结构深的情况。能够快速找到 你要查找的内容。

快速入门

xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<中国>
    <湖北省 id="hubei">
        <武汉市>
            <洪山区>定浩</洪山区>
            <江夏区>郭龙</江夏区>
        </武汉市>
        <黄石市>
            <黄石港>
                <name>徐峰</name>
                <name>陈宇波</name>
                <name>黄雨浩</name>
                <name>杨耿</name>
            </黄石港>
            <大冶区>张佑威</大冶区>
        </黄石市>
    </湖北省>
</中国>

工具类

//自定义的工具类,专门用于获取 Document的对象
public class DocumentUtils {

    public static Document getDocument(String path) throws DocumentException {
        Document doc = null;
        //封装成为File的对象
        File f = new File(path);
        //判断,如果文件存在,则返回对象,否则不返回
        if (f.exists()){
            SAXReader sax = new SAXReader();
            doc = sax.read(f);
        }
        return doc;
    }
}

测试类

//目标:学习 Xpath 的快速入门
public class Test01 {

    public static void main(String[] args) throws Exception{
        //通过工具类,获取到 Documet的对象
        String path = "JavaSEDay21\\dir\\13_省市关系.xml";
        Document doc = DocumentUtils.getDocument(path);
        //直接采用 Xpath解析
        //List<Node> mList = doc.selectNodes("/中国/湖北省/黄石市/黄石港/name");
        List<Node> mList = doc.selectNodes("/name");
        for (Node nameNode : mList) {
            String name = nameNode.getName();
            String text = nameNode.getText();
            System.out.println(name+","+text);
        }
    }
}

测试类,获取所有的属性 id

//目标:学习 Xpath 的快速入门
@SuppressWarnings("all")
public class Test02 {

    public static void main(String[] args) throws Exception{
        //通过工具类,获取到 Documet的对象
        String path = "JavaSEDay21\\dir\\13_省市关系.xml";
        Document doc = DocumentUtils.getDocument(path);
        //直接采用 Xpath解析
        //这里 //表示获取所有的信息,加上了 @则表示是属性。
        List<Node> nodes = doc.selectNodes("//@id");
        for (Node n : nodes) {
            System.out.println(n.getText());
        }
    }
}

参考文档手册。 w3cshool, 找到 XML 找到 Xpath

第06节 XML生成

案例代码

//目标:将对象写入到 XML文件当中
@SuppressWarnings("all")
public class Test01 {

    public static void main(String[] args)  throws IOException {

        //创建一个对象,将对象写入到XML文件当中
        Hero hh = new Hero(1,"赵云",20);
        //1.需要创建一些列的对象,添加到Document树当中
        //创建Document树在内存当中。
        Document doc = DocumentHelper.createDocument();
        Element root = doc.addElement("lol");
        Element hero = root.addElement("hero");
        hero.addAttribute("id",hh.getId()+"");
        hero.addElement("name").addText(hh.getName());
        hero.addElement("age").addText(hh.getAge()+"");

        //2. 准备数据
        String path = "JavaSEDay21\\dir\\14_英雄联盟.xml";
        FileWriter fw = new FileWriter(path);
        OutputFormat format = new OutputFormat();
        format.setEncoding("UTF-8");
        //3.直接往XML当中写入。 XMLWriter类
        XMLWriter xw = new XMLWriter(fw,format);
        xw.write(doc);
        xw.flush();
        xw.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值