XML

Posted 21seu-ftj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML相关的知识,希望对你有一定的参考价值。

## XML

1、概念:Extensible Markup Language  可扩展标记语言

  *  可扩展:标签都是自定义的。<user>  <student>

2、功能

  *  存储数据

    1、配置文件

    2、在网络中传输

3、XML与html区别

  (*  w3c:万维网联盟)

  1、xml标签都是自定义的,html的标签是预定义的。

  2、xml语法严格,html语法松散

  3、xml存储数据,html展示数据

4、语法

  *  基本语法:

  1、xm;文档的后缀名:.xml

  2、xml第一行必须写文档声明  <?xml verson=‘1.0‘?>

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

  4、属性值必须使用引号引起来(单双引都可以)

  5、标签必须正确关闭

  6、xml标签区分大小写

<?xml version=‘1.0‘ ?>

<users>
<user id=‘1‘>
<name>zhangsan</name>
<age>1</age>
<gender>male</gender>
</user>

<user id=‘2‘>
<name>lisi</name>
<age>2</age>
<gender>famale</gender>
</user>
</users>

5、组成部分

  1、文档声明

  格式: <?xml 属性列表 ?>

  属性列表:

  *  version:版本号

  *  encoding:编码格式。高柱解析引擎当前文档的使用的字符集,默认值ISO-8859-1

  *  standalone:是否独立

    *  取值:yes:不依赖其他文件;   no:依赖其他文件

  2、指令(了解):结合CSS

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/css" href="user.css" ?>
<users>
    <user id=‘1‘>
        <name>zhangsan</name>
        <age>1</age>
        <gender>male</gender>
    </user>

    <user id=‘2‘>
        <name>lisi</name>
        <age>2</age>
        <gender>famale</gender>
    </user>
</users>
name{
    color:red;
}

  3、标签:自定义的标签名

  *  规则:①名称可以包含字母,数字以及其他的字符;②名称不能以数字或者标点符号开始;③名称不能以字母 xnl (或者XML 、xml 等等)开始;④名称不能包含空格

  4、属性

    id属性值唯一

  5、文本:

  *  CDATA区:在该区域中的数据会被原样展示

    *  格式:<![CDATA[  数据 ]]>

<?xml version="1.0" encoding="utf-8" ?>
<users>
    <user id=‘1‘>
        <name>zhangsan</name>
        <age>1</age>
        <gender>male</gender>
    </user>

    <user id=‘2‘>
        <name>lisi</name>
        <age>2</age>
        <gender>famale</gender>
        <code>
            <!--if(a &lt; b &amp;&amp; a &gt; c){}-->
            <![CDATA[
if(a < b && a > c){}
]]>

        </code>
    </user>
</users>

 6、约束:规定xml文档的书写规则

  *  作为框架的使用者(程序员):

  1、能够在xml中引入约束文档

  2、能够简单读懂约束文档

  *  分类:

  1、DTD:一种简单的约束技术

  2、Schema:一种复杂的约束技术

  *  DTD:

    *  引入dtd文档到xml文档中

      *  内部dtd:将约束规则定义在xml文档中

      *  外部dtd:将约束的规则定义在外部的dtd文件中:

        *  本地 :<!DOCTYPE 根标签名  SYSTEM  “dtd文件的位置”>

        *  网络:<!DOCTYPE 根标签名  PUBLIC  “dtd文件的名字”  “dtd文件的位置URL”>

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT classrooms (classroom+)>
<!ELEMENT classroom (grade,classname,students)>
<!ATTLIST classroom id  ID #REQUIRED>
<!ELEMENT classname (#PCDATA)>
<!ELEMENT grade (#PCDATA)>
<!ELEMENT students (student+)>
<!ELEMENT student (id,studentname,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT studentname (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE classrooms SYSTEM "class.dtd">
<classrooms>
    <classroom id="c1">
        <grade>2010</grade>
        <classname>10级计算机应用技术一班</classname>
        <students>
            <student>
                <id>1</id>
                <studentname>宋发准</studentname>
                <age>12</age>
            </student>
            <student>
                <id>1</id>
                <studentname>宋发准</studentname>
                <age>12</age>
            </student>
        </students>
    </classroom>
    <classroom id="c2">
        <grade>2010</grade>
        <classname>10级计算机应用技术二班</classname>
        <students>
            <student>
                <id>2</id>
                <studentname>李四</studentname>
                <age>22</age>
            </student>
            <student>
                <id>2</id>
                <studentname>李四</studentname>
                <age>22</age>
            </student>
        </students>
    </classroom>
</classrooms>

  *  Schmea

    *  引入:

    1、填写xml文档的根元素

    2、引入xsi前缀  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    3、引入xsd文件命名空间  

    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

    4、为每个xsd约束声明一个前缀,作为标识 xmlns="http://xmlns.jcp.org/xml/ns/javaee"

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

  7、解析:操作xml文档,将文档中的数据读取到内存中

    *  操作xml文档

    1、解析(读取):将文档中的数据读取到内存中

    2、写入:将内存中的数据保存到xml文档中。持久化的存储

    *  解析xml的方式:

    1、DOM:将标记语言文档一次性加载进内存,在内存中会形成一颗DOM树

    *  优点:操作方便,可以对文档进行CRUD的所有操作

    *  缺点:占内存

    2、SAX:逐行读取,基于事件驱动的。 

    *  优点:不占内存。

    *  缺点:只能读取,不能增删改。

    *  xml常见的解析器:

      1、JAXP:SUN公司提供的解析器,支持DOM和SAX两种思想

      2、DOM4J:一款非常优秀的解析器

      3、jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

      4、PULL:android操作系统内置的解析器,sax方式的。

    *  jsoup

      * jsoup快速入门

        * 步骤:

        1、导入jar包

        2、获取Document对象

        3、获取对应的标签Element对象

        4、获取数据

 

package XML.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

/**
 * Jsoup快速入门
 */
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //获取Document对象,根据一个xml文档来获取
        //获取student.xml的path
        //String path = JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
        //解析xml文档,加载文档进内存,获取dom树--->Document对象
        Document doc = Jsoup.parse(new File(path), "utf-8");
        //获取元素对象 Element对象
        Elements elements = doc.getElementsByTag("name");
        System.out.println(elements.size());//2
        //获取第一个Element对象
        Element element = elements.get(0);
        String name = element.text();
        System.out.println(name);
    }
}

 

    *  对象的使用:

      1、Jsoup:工具类,可以解析html或xml文档,返回Document对象

        *  parse:解析html或xml文档,返回Document

          * parse(File in, String charsetName):解析xml或html文件的

          * parse(String html):解析xml或html字符串

          * parse(URL url,int timeoutMillis):通过网络路径来获取指定的xml,html文档对象

      2、Document对象:文档对象,代表内存中的dom树

        *  获取Element对象

          *  getElementById(String id):根据id属性值来获取唯一的element对象

          *  getElementsByTag(String tagName):根据标签名称获取元素对象集合

          *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合

          *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合

      3、Elements:元素Element对象的集合。可以当作ArrayList<Element>来使用

      4、Element:元素对象

        1、获取子元素对象

        *  getElementById(String id):根据id属性值来获取唯一的element对象

        *  getElementsByTag(String tagName):根据标签名称获取元素对象集合

        *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合

        *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合

        2、获取属性值

        *  String attr(String key):根据属性名称来获取属性值

        3、获取文本内容:

        *  String text():获取文本内容

        *  String html():获取标签体的所有内容(包括子标签的字符串内容)

      5、Node:节点对象

        *  Document和Element的父类

package XML.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

public class JsoupDemo04 {
    public static void main(String[] args) throws IOException {
        /*
        Element:元素对象
        1、获取子元素对象
        *  getElementById(String id):根据id属性值来获取唯一的element对象
        *  getElementsByTag(String tagName):根据标签名称获取元素对象集合
        *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合
        *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合
        2、获取属性值
        *  String attr(String key):根据属性名称来获取属性值
        3、获取文本内容:
        *  String text():获取文本内容
        *  String html():获取标签体的所有内容(包括子标签的字符串内容)
         */
        String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
        Document doc = Jsoup.parse(new File(path), "utf-8");
        //通过Document对象获取name标签,获取所有的name标签
        Elements eles = doc.getElementsByTag("name");
        System.out.println(eles.size());
        System.out.println("--------------------------");
        Element eles2 = doc.getElementsByTag("student").get(0);
        System.out.println(eles2.getElementsByTag("name").size());
        //获取student对象的属性值
        String number = eles2.attr("number");//不区分大小写
        System.out.println(number);
        //获取文本内容
        System.out.println("--------------------------");
        String text = eles2.text();
        String html = eles2.html();
        System.out.println(text);
        System.out.println("<><><><><><><><><><><>");
        System.out.println(html);
    }
}

    *  快捷查询方式:

      1、selector:选择器

      *  使用的方法:Elements     select(String cssQuery)

          *  语法:参考Selector类中定义的语法

package XML.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

/**
 * 选择器查询
 */
public class JsoupDemo05 {
    public static void main(String[] args) throws IOException {
        String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
        //解析xml文档,加载文档进内存,获取dom树--->Document对象
        Document doc = Jsoup.parse(new File(path), "utf-8");
        //查询name标签
        Elements elements = doc.select("name");
        //System.out.println(elements);
        //查询id值为id1
        Elements elements1 = doc.select("#id1");
        //System.out.println(elements1);
        //获取students标签并且number属性为0001的age子标签
        //第一步
        Elements element2 = doc.select("student[number=‘0001‘]");
        //System.out.println(element2);
        //第二步
        Elements element3 = element2.select("student > age");
        System.out.println(element3);
    }
}

      2、XPath:XPath即为XML路径语言,它是用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言

      *  使用Jsoup的XPath需要额外导入jar包。

      *  查询w3cschool参考手册,使用xpath的语法完成查询    https://www.w3cschool.cn/xpath/xpath-syntax.html

package XML.jsoup;

import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * XPath查询
 */
public class JsoupDemo06 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
        //解析xml文档,加载文档进内存,获取dom树--->Document对象
        Document doc = Jsoup.parse(new File(path), "utf-8");

        //根据document对象,创建JXDocument对象
        JXDocument jxDocument = new JXDocument(doc);
        //结合xpath语法查询
        //查询所有的student标签
        /*List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }*/
        //查询所有student标签下的name标签
        /*List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }*/
        //查询student标签下,带id属性的的name标签
        /*List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }*/
        //查询student标签下,带id属性的的name标签,且id属性值为id1
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id=‘id1‘]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}

 

以上是关于XML的主要内容,如果未能解决你的问题,请参考以下文章

需要示例代码片段帮助

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

创建片段而不从 java 代码实例化它

如何组合绑定片段而不将它们包装在 XML 文字中

我们可以在活动 xml 中编写 UI 以及在片段 xm 中编写 UI 吗?

VS中添加自定义代码片段——偷懒小技巧