从初识XML到解析XML

1 篇文章 0 订阅

XML的简介

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准
  • XML 允许创作者定义自己的标签和自己的文档结构。
  • XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

XML文件的创建

1.直接创建file,取名为xxx.xml
2.配置模板,这样以后创建起来就很方便了。
在这里插入图片描述

XML语法

1.所有 XML 元素都须有关闭标签。

//错误演示
<p>This is a paragraph
//正确写法
<p>This is another paragraph</p>

2.XML 标签对大小写敏感。

<Message>这是错误的。</message>
<message>这是正确的。</message> 

3.XML 必须正确地嵌套。

<b><i>错误嵌套</b></i>
<b><i>正确嵌套</i></b>

4.XML 文档必须有一个根元素。

<root>
  <child>
    ...
  </child>
</root>

5.XML 的属性值须加引号。

<student name="zhangsan"></student>

6.在 XML 中,空格会被保留。

<student>a     b</student>
//输出:a     b

7.XML 中的注释。

<!-- 我是一个注解 --> 

8.实体引用(转义字符)。

//解析会出现错误
<student>a>b</student>
//正确写法
<student>a&gt;b</student>

在这里插入图片描述

XML元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分,元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

在这里插入图片描述

XML 元素必须遵循以下命名规则:

  1. 名称可以含字母、数字以及其他的字符。
  2. 名称不能以数字或者标点符号开始。
  3. 名称不能以字符 “xml”(或者 XML、Xml)开始。
  4. 名称不能包含空格。

属性的定义以及注意事项:

  1. 属性必须定义在标签体的开始标签体内。
  2. 以键值对的方式定义,值必须用引号引起来( 属性名=“属性值”)。
  3. 一个标签中可以有多个属性,但是不能有同名的属性。
  4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头。

xml标签的两种写法:

//普通闭合标签  可以有子元素且可以有属性和文本
<birthday></birthday>
//自闭合标签  不能有子元素且只能有属性
<birthday/>

dtd约束

定义dtd约束:

<!-- xml中有一个根标签books
    标签books中有两个子标签book
    *代表的多个-->
<!ELEMENT books (book*) >

<!-- book中有多个标签 *代表可以写多个 -->
<!ELEMENT book (press*,birthday*,price*)>

<!-- #PCDATA:此标签体中应该是文本-->
<!ELEMENT press (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT price (#PCDATA)>

<!-- book标签中有一个属性:name 必须设置(#REQUIRED)-->
<!ATTLIST book name CDATA #REQUIRED>

XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 绑定约束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
    <book name = "《武林秘籍》">
        <press>王大师</press>
        <birthday>2010-6-6</birthday>
        <price>125.00</price>
    </book>
    <book name="《降龙十八掌》">
        <press>星爷</press>
        <birthday>2005-5-5</birthday>
        <price>115.80</price>
    </book>
</books>

约束解读:

  DOCTYPE:文档类型
  books :根标签
  SYSTEM:本地系统文件
  "bookss.dtd":产生关系的文件名
  book*可以写多哥该标签
  CDATA:代表的是标签中的属性值为字符型
  #REQUIRED:属性值必须设置

Schema约束

关于Schema请参照:
https://blog.csdn.net/jdbdh/article/details/82469404

使用dom4j解析

把整个xml文档加载进内存,保留完整的结构信息,然后进行解析。

使用前:导入相关jar包

用到的API :

  • SAXReader (核心类)

  • Document read(绑定了这个xml文件的输入流); 传入一个输入流,返回一个Document对象

Document对象:

  • Element getRootElement(); 获取跟标签

Element标签对象:

  • List elements(); 获取当前根标签下所有的标签
  • String attributeValue(String name); 获取标签内属性的value
  • String elementText(String name); 获取指定标签的文本内容,不能是当前标签
  • String getText(); 获取当前标签的文本内容

xml文档

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 绑定约束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
    <book name = "《武林秘籍》">
        <press>王大师</press>
        <birthday>2010-6-6</birthday>
        <price>125.00</price>
    </book>
    <book name="《降龙十八掌》">
        <press>星爷</press>
        <birthday>2005-5-5</birthday>
        <price>115.80</price>
    </book>
</books>

dom4j解析

public class BooksTest {
    public static void main(String[] args)throws Exception {
        InputStream in = BooksTest.class.getClassLoader().getResourceAsStream("books.xml");

        //创建SAXRead对象
        SAXReader sr = new SAXReader();
        Document read = sr.read(in);

        //获取根标签books
        Element element = read.getRootElement();

        //获取books下所有book
        List<Element> list = element.elements();

        //遍历所有book
        for (Element e : list) {
            String name = e.attributeValue("name");

            String press = e.elementText("press");
            String birthday = e.elementText("birthday");
            String price = e.elementText("price");

            System.out.println("书名:" + name + " 出版设:" + press + " 出版日期:" + birthday + " 价格:" + price);
        }
    }
}

结果:

书名:《武林秘籍》 出版设:王大师 出版日期:2010-6-6 价格:125.00
书名:《降龙十八掌》 出版设:星爷 出版日期:2005-5-5 价格:115.80

使用xpath解析

使用前:导入相关jar包,并且需要有dom4j的支持。

用到的方法:

  • List selectNodes(String name); 获取所有的指定标签的内容。
  • Node selectSingleNode(String name); 获取指定标签的第一个内容。

xml文档

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student number="001">
        <name id="it">
            <xing></xing>
            <ming></ming>
        </name>
        <age>18</age>
        <sex>nan</sex>
    </student>
    <student number="002">
        <name>jack</name>
        <age>18</age>
        <sex>nv</sex>
    </student>
</students>

xpath解析

public class StudentTest {
    public static void main(String[] args)throws Exception {
        InputStream in = StudentTest.class.getClassLoader().getResourceAsStream("student.xml");

        //获取SAXReader对象
        SAXReader sr = new SAXReader();
        Document read = sr.read(in);

        //获取根标签students
        Element element = read.getRootElement();

        //获取所有age
        List<Node> ages = element.selectNodes("//age");
        System.out.println("age们:" + ages);

        //获取所有sex
        List<Node> sexs = element.selectNodes("/students/student/sex");
        System.out.println("sex们:" + sexs);

        //获取第一个sex
        Node sex = element.selectSingleNode("//sex");
        System.out.println("第一个sex:" + sex);

        //获取标签是name,属性是id的标签
        Node name = element.selectSingleNode("//name[@id]");
        System.out.println("获取的name:" + name);
    }
}

结果:

age们:[org.dom4j.tree.DefaultElement@1c655221 [Element: <age attributes: []/>], org.dom4j.tree.DefaultElement@41975e01 [Element: <age attributes: []/>]]
sex们:[org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>], org.dom4j.tree.DefaultElement@6d9c638 [Element: <sex attributes: []/>]]
第一个sex:org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>]
第一个name:org.dom4j.tree.DefaultElement@4cdf35a9 [Element: <name attributes: [org.dom4j.tree.DefaultAttribute@5e265ba4 [Attribute: name id value "it"]]/>]

大家还可以参照官方文档学习:https://www.w3school.com.cn/xml/index.asp

不好的地方还请大家指点,我给予改正。(抱拳)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值