XML

XML

1. 概念:

  • Extensible Markup Language,可扩展标记语言。可扩展的意思主要是指,在这种标记语言中,标签是可以自定义的,如定义一个people标签< people >,定义一个emp标签 < emp >

2. 功能

  • 主要用于存储数据,替代properties格式的配置文件,便于在网络中传输等。

3. xml与HTML的区别

  • xml的语法是严格的,HTML的语法是松散的
  • xml的标签都是自定义的,HTML的标签都是预定义的
  • xml主要使用来存储数据的,HTML主要是展示数据的

4. 基本语法

  1. xml文档的后缀名为xml

  2. xml文档第一行必须是文档声明,如 < ?xml version='1.0' ? >

  3. xml文档有且仅有一个根标签

  4. 属性值必须使用引号引起来

  5. 标签必须正确关闭

  6. xml文档标签名大小写敏感的

    <?xml version="1.0"?>
    
    <users>
    	<user>
    		<name>aaa</name>
    		<age>12</age>
    		<gender>male</gender>
    
    	</user>
    	<user>
    		<name>bbb</name>
    		<age>12</age>
    		<gender>male</gender>
    
    	</user>
    	<user>
    		<name>ccc</name>
    		<age>12</age>
    		<gender>female</gender>
    
    	</user>
    </users>
    
    

    5.组成部分

    1. 文档声明:
      1. 格式:< ?xml 属性列表? >
      2. 属性列表:
        • version:版本号,这是必须的属性
        • encoding:编码方法
        • standalone:是否独立,取值为yes或者no,是否依赖其他文件
    2. 指令:用来结合css展示数据,现在一般不使用
    3. 标签:
      1. 名称可以包含字母、数字、其他字符
      2. 名称不可以以数字、标点符号开头
      3. 名称不可以xml开头
      4. 名称不能包含空格
    4. 属性:id值唯一
    5. 文本:
      1. CDATA区的数据会被原样展示:< ![CDATA[ 数据 ]] >

6.xml的解析

操作xml文档,将文档的数据读取到内存中

  1. 解析xml的方法:

    1. DOM方法:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树,一般用在服务器端
      • 优点:操作方便,可以对文档进行CRUD的所有操作
      • 缺点:DOM树加载进内存,更加占用内存
    2. SAX方法:逐行读取,逐行释放,基于事件驱动
      • 优点:每次读取一行,不占用内存,适合内存小的设备
      • 缺点:只能进行读取,不能增删改
  2. XML常见的解析器:

    1. JAXP:SUN公司提供的解析器,支持dom、sax两种方法
    2. DOM4J:一款优秀的解析器
    3. Jsoup:一款Java的HTML解析器,可以直接解析某个URL地址,HTML文本内容
    4. PULL:Android操作系统内置的解析器,sax方法的
  3. Jsoup

    使用步骤:

    1. 导入jar包

    2. 获取document对象

    3. 获取对应的标签,其实就是Element对象

      public class JsoupDemo01 {
          public static void main(String[] args) throws IOException {
              // 通过类加载器,获得xml文件的路径
              String path = JsoupDemo01.class.getClassLoader().getResource("users.xml").getPath();
              // 获取document对象,也就是DOM树加载进内存
              Document document= Jsoup.parse(new File(path), "utf-8");
              // 获取元素对象,返回的Elements是ArrayList的子类
              Elements elements = document.getElementsByTag("name");
              System.out.println(elements.size());
      
              Element element = elements.get(0);
              System.out.println(element.text());
      
          }
      }
      

4.Jsoup的对象:

  1. Jsoup:工具类,可以解析HTML 或者xml文档,返回Document,主要是parse方法,有多个重载形式

    1. parse(File in, String charSetName):解析xml或者HTML文件的
    2. parse(String html):用来解析xml或者HTML字符串
    3. parse(URL url, int timeoutMillis):通过网络路径获取指定的HTML或者xml文档对象
    URL url = new URL("https://www.zhihu.com/question/27574436");
    Document document1 = Jsoup.parse(url, 10000);// 解析某个HTML
    System.out.println(document1);
    
  2. Document对象:文档对象,代表着内存中的dom树

    1. 获取element对象
      1. getElementsByTag(String name):根据标签名获取元素集合
      2. getElementsByAttribute(String key):根据属性名称获取元素对象集合
      3. getElementsByAttributeValue(String key, String value):根据对象的属性名,属性值获取元素对象集合
  3. Elements:元素Element对象的集合,可以当做ArrayList< Element >使用

  4. Element对象:元素对象

    1. 获取子元素对象(子元素也是element对象):
      1. getElementsByTag(String name):根据标签名获取元素集合
      2. getElementsByAttribute(String key):根据属性名称获取元素对象集合
      3. getElementsByAttributeValue(String key, String value):根据对象的属性名,属性值获取元素对象集合
    2. 获取属性值
      1. String attr(String key):根据属性名获取属性值
    3. 获取文本内容:
      1. String text ():获取所有子标签的纯文本内容
      2. String html():获取标签体的所有内容,包括子标签的标签和文本内容
  5. Node:节点对象,是Document和Element的父类

7.Jsoup的两种快捷查询方式

  1. selector:选择器

    1. 方法:Elements select(String cssQuery);
    // 获取user标签,并且id=001的子标签age标签
    Elements el = document.select("user[id="001"] > age");
    System.out.println(el);
    
    // 获取id值为001的元素
    Elements select = document.select("#001");
    System.out.println(select);
    
  2. Xpath:xml路径语言,用来确定xml

    1. 需要导入jar包

    具体语法要去查看Xpath文档,简单的几个

    1. // 标签名:查找所有标签
    2. / 标签名:子标签
    3. [ @id ] : 带有id属性的标签
    // 获取所有的user标签
    JXDocument jxDocument = new JXDocument(document);
    List<JXNode> jxNodes = jxDocument.selN("//user");
    
    for (JXNode jxNode : jxNodes) {
        System.out.println(jxNode);
    }
    // 获取所有user标签下的age标签
    System.out.println("============================");
    
    List<JXNode> jxNodes1 = jxDocument.selN("//user/age");
    for (JXNode jxNode : jxNodes1) {
        System.out.println(jxNode);
    }
    
    System.out.println("===============================");
    
    // 获取带有id属性的user标签
    List<JXNode> jxNodes2 = jxDocument.selN("//user[@id]");
    for (JXNode jxNode : jxNodes2) {
        System.out.println(jxNode);
    }
    System.out.println("===============================");
    
    
    // 获取带有id属性,且属性值是001,的user标签
    List<JXNode> jxNodes3 = jxDocument.selN("//user[@id='001']");
    for (JXNode jxNode : jxNodes3) {
        System.out.println(jxNode);
    }
    
原文地址:https://www.cnblogs.com/zhuobo/p/10750712.html