zoukankan      html  css  js  c++  java
  • Servlet复习-XML

    好久没有写博客了,由于最近管理项目事情实在是太多了,代码都很少敲了,项目中有用到解析XML文件的技术点,解析XML是很老的技术,九几年标准就定了,这次抽几分钟复习一下吧。

    一、什么是 XML?(来自w3school的释义
    XML 指可扩展标记语言(EXtensible Markup Language)
    XML 是一种标记语言,很类似 HTML
    XML 的设计宗旨是传输数据,而非显示数据
    XML 标签没有被预定义。您需要自行定义标签。
    XML 被设计为具有自我描述性。
    XML 是 W3C 的推荐标准

    二、XML特点
    -必须有一个根元素(自定义xml时注意)
    -XML语法严格,标签必须成对出现
    -XML区分大小写

    三、XML格式(如下)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
        xml文件头(固定)
        version版本:1.0(常用) 1.1
        encoding:编码格式
    -->
    <person>
        <info id="p1">
            <name>李白</name>
            <age>25</age>
            <sex>男</sex>
            <address/>
            <!--每一个标签必须结束-->
        </info>
        <info id="p2">
            <name>杜甫</name>
            <age>18</age>
            <sex>男</sex>
            <address/>
        </info>
    </person>
    

    四、XML作用(最重要)
    -传递数据(现在一般大厂的API在被调用时,都会返回两种格式的结果 XML 或者 JSON,JSON化是现在的趋势,数据量小,占用资源更少,流量用的更少,响应速度更快)
    -保存数据(作用:用作配置文件)

    五、XML的问题?
    标签乱写,没有验证容易写错或者漏写!!!
    需要一套规范(定义XML语法(标签顺序和个数))

    六、规范
    由于第五条的问题点,所以XML就出现了规范。
    -DTD 文档类型定义(Document Type Definition)
    -DTD 可以看成一个或者多个XML文件的模板,在这里可以定义XML文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。
    -DTD有四个组成如下:
    元素(Elements)
    属性(Attribute)
    实体(Entities)
    注释(Comments)
    -一个XML文件只能导入一个DTD文件
    -由于DTD限制较多,使用时较不方便,近来已渐被XML Schema所取代。

    七、XML Schema
    XML Schema 是基于 XML 的 DTD 替代者。
    XML Schema 可描述 XML 文档的结构。
    XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
    XML Schema 比 DTD 更强大。

    -一个XML文件可以导入多个Schema文件
    -命名空间(防止XML标签重名问题)
    -一个功能一个命名空间(比如Spring配置文件中的tx:xx标签,tx就是命名空间)

    八、XML的解析方式(两种方式)
    1、DOM:将xml文件解析成一个DOM树,类似HTML的DOM树,然后再解析
    2、SAX:该方式一行一行的解析xml文件,一旦解析过了再想回上一行,就需要重头解析;

    九、DOM4j
    在java中,使用DOM4j来解析XML,这个是基于DOM解析方式,在java中实现解析XML的技术。
    十、举例

    自定义一个XML文件person.xml放到项目路径下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
        xml文件头(固定)
        version版本:1.0(常用) 1.1
        encoding:编码格式
    -->
    <person>
        <info id="p1">
            <name>李白</name>
            <age>25</age>
            <sex>男</sex>
            <address/>
            <!--每一个标签必须结束-->
        </info>
        <info id="p2">
            <name>杜甫</name>
            <age>18</age>
            <sex>男</sex>
            <address/>
        </info>
    </person>
    

    maven的pom.xml文件需要导入两个依赖

        <dependencies>
            <!--Dom4j 基本功能依赖包-->
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
            <!--Dom4j 使用XPath时,需导入的高级功能依赖包-->
            <dependency>
                <groupId>xml</groupId>
                <artifactId>jaxen</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    

    1、通过Dom4j遍历,获取各节点信息

      /**
       * 1、Document:代表整个XML文档
       * 2、Element:代表了XML中的元素
       * @param args
       * @throws DocumentException
       */
      public static void main(String[] args) throws DocumentException {
          SAXReader saxReader = new SAXReader();
          Document document = saxReader.read(new File("D:\workspace_idea\Servlet\Servlet-01\src\main\person.xml"));
          System.out.println(document);
    
          String xmlEncoding = document.getXMLEncoding();
          //获取根元素
          Element rootElement = document.getRootElement();
    
          for (Iterator i = rootElement.elementIterator(); i.hasNext(); ) {
              Element element = (Element) i.next();
              //获取标签名和id属性值
              System.out.println(element.getName() + "=====" + element.attributeValue("id"));
    
              for (Iterator t = element.elementIterator(); t.hasNext(); ) {
                  Element ee = (Element) t.next();
                  //获取标签名和文本值
                  System.out.println(ee.getName() + "++++" + ee.getText());
              }
          }
      }
    

    2、通过XPath语言中的表达式获取指定节点信息(高级用法)

    XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
    对 XPath 的理解是很多高级 XML 应用的基础。

    /**
         * 1、document.selectNodes():选择多个节点
         * 2、document.selectSingleNode():选择一个节点
         * @param args
         * @throws DocumentException
         */
        public static void main(String[] args) throws DocumentException {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(new File("D:\workspace_idea\Servlet\Servlet-01\src\main\person.xml"));
    
            List<Element> list = document.selectNodes("//info/name");
            for (Element element : list) {
                System.out.println(element.getText());
            }
        }
    

    总结:两种方法都可以获取xml节点信息,第二种是高级用法,可以直接获取想要获取的节点信息,其利用了XPath的表达式,该表达式的语法也挺多了,自己可以了解一下。

  • 相关阅读:
    创建react项目
    解决移动端弹窗下页面滚动问题
    前端常用的几种加密方式
    http请求状态码
    vue代理配置
    自动化测试实操案例详解 | Windows应用篇
    Google 再见 Java
    一次诡异的 SQL 数量统计查询不准的问题
    Maven
    淘宝技术分享:手淘亿级移动端接入层网关的技术演进之路
  • 原文地址:https://www.cnblogs.com/elnimo/p/14860815.html
Copyright © 2011-2022 走看看