XML详讲

1、XML概述

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

IDEA创建XML文件

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文件,本身也受到其他约束文件的要求,所以编写的更加严谨
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>
  2. 在编写的xml文件中导入schema约束文档

    <?xml version="1.0" encoding="utf-8" ?>
    <书架 xmlns="http://www.itcast.cn">
    </书架>
  3. 按照约束内容编写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解析更加方便
XML详讲
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的元素、属性、文本
方法名 说明
Listelements() 得到当前元素下的所有子元素
Listelements(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(“表达式”) 获取符合表达式的唯一元素
ListselectNodes(“表达式”) 获取符合表达式的元素集合

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"));
    }


原文始发于微信公众号(小林学编程):XML详讲

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/219430.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!