• 学习笔记—XML


    XML

    XML简介

      XML指可扩展标记语言(EXtensible Markup Language),是一种标记语言。

      XML是一种灵活的语言,标签没有被预定义,需要自行定义标签。

      通常,XML被用于信息的记录和传递,而非显示数据。XML被设计为具有自我描述性。

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

    XML语法

      声明信息,它定义XML的版本(1.0)和所使用的编码(一般为UTF-8)

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

       xml有且仅有一个根元素

      xml是大小写敏感的

      标签是成对的,必须正确嵌套

      xml的属性值必须加引号

      注释的写法

    <!-- 这里是注释 -->

    XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。

      形式良好的xml实例

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 这里是注释 -->
    <books>
        <book id="01">
            <name>java从入门到精通</name>
            <author>Tom</author>
            <price>45.6</price>
        </book>
        <book id="02">
            <name>mysql学习指南</name>
            <author>lili</author>
            <price>49.6</price>
        </book>
    </books>

    拥有正确语法的 XML 被称为“形式良好”的 XML。

    通过 DTD 验证的 XML 是“合法”的 XML。

    DTD

    DTD简介

      DTD(Document Type Definition文档类型定义)

      DTD用与约束xml的文档格式。可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

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

    使用DTD

    内部DTD的定义

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

       元素声明语法

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

      数量词

    • +  :表示出现 1 次或多次,至少一次。
    • ?:表示出现 0 次或 1 次
    • *  :表示出现任意次

      属性声明语法

    • 属性类型:CDATA,表示字符数据(character data)
    • 默认值:
      • #REQUIRED  表示必须出现
      • #IMPLIED  表示不是必须的
    <!ATTLIST 元素名称 属性名称 属性类型 默认值>

      

      合法的xml实例

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 声明内部DTD -->
    <!DOCTYPE books [
        <!ELEMENT books (book*) >
        <!ELEMENT book (name,author,price)>
        <!ATTLIST book id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        <!ELEMENT price (#PCDATA)>
    ]>
    <books>
        <book id="01">
            <name>java从入门到精通</name>
            <author>Tom</author>
            <price>45.6</price>
        </book>
        <book id="02">
            <name>mysql学习指南</name>
            <author>lili</author>
            <price>49.6</price>
        </book>
    </books>

    外部DTD定义

      创建一个独立的DTD文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT books (book*) >
    <!ELEMENT book (name,author,price)>
    <!ATTLIST book id CDATA #REQUIRED>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT price (#PCDATA)>

      在xml中引入外部DTD文件

    <!DOCTYPE 根元素 SYSTEM "文件名">

      实例

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入外部DTD文件 -->
    <!DOCTYPE book SYSTEM "book.dtd">
    <books>
        <book id="01">
            <name>java从入门到精通</name>
            <author>Tom</author>
            <price>45.6</price>
        </book>
        <book id="02">
            <name>mysql学习指南</name>
            <author>lili</author>
            <price>49.6</price>
        </book>
    </books>

    XSD(XML Schema Definition)

      XML Schema 是DTD 的替代者

      XSD 不仅可以定义XML文档的结构,还可以规范文档的内容

      XSD 本身也是XML文档

      XSD 采用XML文档来定义语义约束,比DTD要复杂一些,但是功能强大。

    • 支持丰富的数据结构
    • 允许开发者自定义数据类型
    • 可读性强
    • 可针对未来需求进行扩展

    XML的解析

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

    常见的xml解析技术

    DOM解析

      XML DOM(XML Document Object Model),即XML文档对象模型。

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

      XML文档对象模型定义访问和操作XML文档的标准方法。

    SAX解析

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

      消耗资源小,适用于数据量较大的XML。

    JDOM解析

      第三方提供,开源免费。

      比DOM更快,使用具体类而不使用接口。

    DOM4J

      第三方提供,开源免费。

      是JDOM的升级版。

    DOM4J解析XML

      借助DOM4J解析读取XML文件内容。

        /**
         * 借助DOM4J解析读取XML文件内容
         * 
         * @author shangyang
         * @throws Exception
         */
        public static void readerXML() throws Exception {
    
            // 创建SAXReader对象,用于读取xml
            SAXReader reader = new SAXReader();
            // 读取xml文件,得到Document对象
            Document doc = reader.read(new File("src/book.xml"));
            // 获取根元素
            Element root = doc.getRootElement();
            // 获取根元素下所有子元素
            Iterator<Element> it = root.elementIterator();
            while (it.hasNext()) {
                // 取出元素
                Element e = it.next();
                // 获取id属性
                Attribute id = e.attribute("id");
                System.out.println(e.getName() + id.getValue());
                // 获取子元素
                Element name = e.element("name");
                Element author = e.element("author");
                Element price = e.element("price");
    
                System.out.println(name.getName() + " = " + name.getStringValue());
                System.out.println(author.getName() + " = " + author.getStringValue());
                System.out.println(price.getName() + " = " + price.getText());
                System.out.println("--------------");
            }
        }

     

      通过DOM4J解析生成xml文件

        /**
         * 通过DOM4J解析生成xml文件
         * @author shangyang
         * @throws Exception
         */
        public static void writerXML() throws Exception {
            // 1、通过DocumentHelper生成一个Document对象
            Document doc = DocumentHelper.createDocument();
            // 2、添加并得到根元素
            Element root = doc.addElement("sources");
            // 3、为根元素添加子元素
            Element student = root.addElement("student");
            // 4、为student元素添加属性
            student.addAttribute("id", "1614010101");
            // 5、为student添加子元素
            Element name = student.addElement("name");
            Element course = student.addElement("course");
            Element results = student.addElement("results");
            // 6、为子元素添加文本
            name.addText("张三");
            course.addText("数据结构");
            results.addText("67");
            // 7、将doc输出到xml文件中
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(new FileWriter(new File("src/sources.xml")), format);
            writer.write(doc);
            writer.close();
        }




    作者:殇央 © 转载请注明出处。

    -------------------------------------------

    如果有错误或者更优化的解决方案,欢迎大家在评论区留言探讨。

    也可以给我的个人公众号私信留言。

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    【JavaWeb】Hibernate Dao层设计
    【C#】身份证识别(一):身份证号定位
    【JavaWeb】SpringMVC重定向页面取值
    关于chrome扩展的东西
    【C#】基于Opencv/Emgucv的身份证识别
    Bashware
    【java多线程】分段阶乘计算
    【java】多项式计算(中缀转后缀)
    iOS  OTA问题排查【itms-servers协议在线安装ipa包】
    【深度学习】BP算法分类iris数据集
  • 原文地址:https://www.cnblogs.com/shangyang/p/10553805.html
  • Copyright © 2020-2023  润新知