XML

简介: XML是可扩展标记语言(eXtensible Markup Language)的缩写,是一种数据表示格式,可以描述非常复杂的数据结果,如果XML内容存为文件,那么它就是一个XML文件- XML的内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统信息
1、XML概述
  • XML是可扩展标记语言(eXtensible Markup Language)的缩写,是一种数据表示格式,可以描述非常复杂的数据结果,如果XML内容存为文件,那么它就是一个XML文件
  • XML的内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统信息
2、XML的创建
  • 创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml

IDEA创建XML文件

image-20231022092751823

3、XML语法规则
  • XML文件的后缀名为:xml

  • 文档声明必须是第一行

    <?xml version="1.0" encoding="utf-8" ?>
    
    • version:xml默认的版本号码,该属性是必须存在的

    • encoding:本xml文件的编码

  • XML的标签(元素)规则

    • 标签由一对尖括号和合法标识符组成,必须有且只有一个根标签

      <name></name>
      
    • 标签必须有开始就有结束

    • 特殊标签可以不成对,但必须有结束标识

      <br/>
      
    • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来

      <student id = "1"></name>
      
    • 标签需要正确的嵌套

      <student id = "1">
          <name>张三</name>
      </student>
      
4、XML的其他组成
  • XML文件中可以定义注释信息

    <!--这是注释 -->
    
  • XML文件中可以存在以下特殊字符

    &lt;    <     小于
    &gt;    >    大于
    &amp;    &    和号
    &apos;    '    单引号
    &quot;    "    双引号
    
5、XML文档约束方式

什么是文档约束?

文档约束就是用来限定xml文件中的标签及其属性该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件

文档约束的分类

  • DTD
  • schema
5.1、XML文档约束-DTD的使用

利用DTD文档约束,约束一个xml文件的编写

  1. 编写DTD约束文档,后缀必须是.dtd

    这里可以用英文哦,演示用中文

    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
    
  2. 在需要编写的XML文件中导入该DTD约束文件

    <!DOCTYPE 书架 SYSTEM "data.dtd">
    
  3. 按照约束的规则编写XML文件内容

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE 书架 SYSTEM "data.dtd">
    <书架>
        <>
            <书名>web从入门到精通</书名>
            <作者>小林</作者>
            <售价>9.9</售价>
        </>
    </书架>
    

这里大家应该有意识到,dtd并不能约束数据的类型,所以还有第二种约束方式

5.2、XML文档约束-schema的使用

文档约束-schema

  • schema可以约束具体的数据类型,约束能力更强大
  • schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨

image-20231022100859864

利用schema文档约束,约束一个xml文件的编写

  1. 编写schema约束文档,后缀必须是.xsd

    <?xml version="1.0" encoding="UTF-8" ?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.itcast.cn"
            elementFormDefault="qualified">
        <element name="书架">
            <complexType>
                <sequence maxOccurs="unbounded">
                    <element name=''>
                        <complexType>
                            <sequence>
                                <element name='书名' type="string"></element>
                                <element name='作者' type="string"></element>
                                <element name='售价' type="double"></element>
                            </sequence>
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>
    </schema>
    
  1. 在编写的xml文件中导入schema约束文档

    <?xml version="1.0" encoding="utf-8" ?>
    <书架 xmlns="http://www.itcast.cn">
    </书架>
    
  2. 按照约束内容编写xml文件的标签

        <>
            <书名>web</书名>
            <作者>小林</作者>
            <售价>1.0</售价>
        </>
    
6、XML解析

什么是XML解析

  • 使用程序读取XML中的数据

两种解析方式

  • SAX解析
  • DOM解析(常用)
7、Dom解析

Dom常见的解析工具

名称 说明
JAXP SUN公司提供的一套XML的解析API
JDOM JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生产、序列化及多种操作
dom4j 是JDOM的升级品,用来读取XML文件的,具有性能优异,功能强大和极其容易使用的特点,它的性能超过sun公司官方的dom技术,同时它是一个开放源代码的软件,HIbernate也是用它来读写配置文件
jsoup 功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便

image-20231022103547221

7.1、使用Dom4j解析出XML文件

使用Dom4j解析出XML文件的数据进行解析

  1. 下载Dom4j框架,官网下载:dom4j
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.1.jar复制到lib文件夹中
  4. 在jar文件上点击,选择add as library
  5. 在类中导包使用

Dome4j解析XML-得到Document对象

  • SAXReader类

    | 构造器 | 说明 |
    | :-----------------------: | :-------------------------: |
    | public SAXReader() | 创建Dom4j的解析器对象 |
    | Document read(String url) | 加载XML文件成为Document对象 |

  • Document类

    | 方法名 | 说明 |
    | :----------------------: | :------------: |
    | Element getRootElement() | 获取根元素对象 |

    使用Dom4j获取根元素

    public class demo01 {
         
         
        @Test
        public void parseXml() throws DocumentException {
         
         
            // 1、创建一个SAXReader解析对象:代表了Dom4j框架
            SAXReader saxReader = new SAXReader();
    
            //2、加载xml文件成为Document对象
            InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
            Document document = saxReader.read(is);
    
            // 3、文档对象获取根元素
            Element rootElement = document.getRootElement();
            System.out.println(rootElement.getName());
        }
    }
    
7.2、使用Dom4j解析XML的元素、属性、文本
方法名 说明
List elements() 得到当前元素下的所有子元素
List elements(String name) 得到当前元素下指定名字的子元素返回集合
Elment element(String name) 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName() 得到元素名字
String attributeValue(String name) 通过属性名直接得到属性值
String elementText(子元素名) 得到指定名称的子元素的文本
String getText() 得到文本

代码演示

public class demo01 {
   
   
    @Test
    public void parseXml() throws DocumentException {
   
   
        // 1、创建一个SAXReader解析对象:代表了Dom4j框架
        SAXReader saxReader = new SAXReader();

        //2、加载xml文件成为Document对象
        InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        // 3、文档对象获取根元素
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());
    }

    @Test
    public void parseXMLAllNode() throws DocumentException {
   
   
        // 1、创建一个SAXReader解析对象:代表了Dom4j框架
        SAXReader saxReader = new SAXReader();

        //2、加载xml文件成为Document对象
        InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3、提取根元素对象
        Element rootElement = document.getRootElement();
        //4、提取根元素下的全部一级子元素
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
   
   
            System.out.println(element.getName());
            //5、获取属性值
            System.out.println(element.attributeValue("id"));

            //6、获取文本信息
            System.out.println(element.elementText("name"));

            //先得到元素对象,再取文本值
            Element name = element.element("name");
            System.out.println(name.getText());
            System.out.println(name.getTextTrim());
        }



    }
}
8、XPath技术

Xpath技术提供了简洁的方式进行XML信息的检索

  • Xpath使用路径表达式来定位XML文档中的元素节点或属性节点

使用Xpath检索出XML文件

  1. 导入(dom4j和jaxen-1.1.2.jar),Xpath技术依赖Dom4j技术
  2. 通过dom4j和SAXReader获取Document对象
  3. 利用Xpath提供的API,结合Xpath的语法完成选取XML文档元素节点进行解析操作
方法名 说明
Node selectSingleNode("表达式") 获取符合表达式的唯一元素
List selectNodes("表达式") 获取符合表达式的元素集合

Xpath的四大检索方案

  • 绝对路径

    @Test
    public void parse01() throws DocumentException {
         
         
         SAXReader saxReader = new SAXReader();
         Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
            //直接检索
         List<Node> nodes = document.selectNodes("/contactList/contact/name");
         for (Node node : nodes) {
         
         
             Element element = (Element) node;
             System.out.println(element.getTextTrim());
        }
    }
    
  • 相对路径

    @Test
    public void parse02() throws DocumentException {
         
         
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
        //先得到根元素
        Element rootElement = document.getRootElement();
        List<Node> nodes = rootElement.selectNodes("./contact/name");
        for (Node node : nodes) {
         
         
            Element element = (Element) node;
            System.out.println(element.getTextTrim());
        }
    }
    
  • 全文检索

        @Test
        public void parse03() throws DocumentException {
         
         
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
            /**
             * //元素             在全文找到这个元素
             * //元素1/元素2       在全文找元素1下面的全部元素2
             * //元素1//元素2
             */
    //        List<Node> nodes = document.selectNodes("//name");
    //        List<Node> nodes = document.selectNodes("//contact/name");
            List<Node> nodes = document.selectNodes("//contact//name");
            for (Node node : nodes) {
         
         
                Element element = (Element) node;
                System.out.println(element.getTextTrim());
            }
        }
    
  • 属性查找

    @Test
    public void parse04() throws DocumentException {
         
         
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
    
        //获取属性
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
         
         
            Attribute attribute = (Attribute) node;
            System.out.println(node.getName()+":"+attribute.getValue());
        }
    
        //检索元素,检索contace,带id属性
        List<Node> nodeList = document.selectNodes("//contact[@id]");
        for (Node node : nodeList) {
         
         
            Element element = (Element) node;
            System.out.println(element.elementTextTrim("name"));
        }
    
        //检索单个
        Node node = document.selectSingleNode("//contact[@id='1']");
        Element element = (Element) node;
        System.out.println(element.elementTextTrim("name"));
    }
    
相关文章
|
2月前
|
XML 数据格式
|
6月前
|
XML Java 区块链
为什么需要用xml
为什么需要用xml
|
11月前
|
XML JSON JavaScript
了解xml
即使在xml被json'替代的今天,你也应该了解它。
126 0
|
XML 存储 数据处理
xml
xml
75 0
|
XML 存储 PHP
XML简单基础详解(I)
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
81 0
XML简单基础详解(I)
|
XML 数据库 数据安全/隐私保护
|
Web App开发 存储 XML
XML学习笔记了解一下
前言: XML Schema 是基于 XML 的 DTD 替代者。json现在也是用来替代XML了 这是我所了解的 那请问还需要学XML吗? 也许毕业了工作了,遇到的项目是以前的 ,需要XML那怎么办? 个人觉得还是有必要的,毕竟是基础,虽然是过时了的技术,但还是有必要掌握一下的,而且花费的时间也不多,大概2天。
2219 0
|
XML JavaScript Java
XML就是这么简单
什么是XML? XML:extensiable markup language 被称作可扩展标记语言 XML简单的历史介绍: gml->sgml->html->xml gml(通用标记语言)–在不同的机器进行通信的数据规范 sgml(标准通用标记语言) html(超文本标记语言) 为什么我们需要...
1239 0
|
Web App开发 JavaScript 数据格式