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的表达式,该表达式的语法也挺多了,自己可以了解一下。

posted @ 2021-06-07 22:22  温森  阅读(72)  评论(0编辑  收藏  举报