XML

予早 2025-02-21 01:08:21
Categories: Tags:

XML

XML,Extensible Markup Language,可扩展标记语言。

功能:

存储数据,可作为配置文件、在网络中传输

语法

语法:

XML第一行第一列是文档声明

XML文档有且仅有一个根标签

XML标签属性值必须使用单引号或者双引号标识

XML标签必须正确关闭

XML标签名称区分大小写

CDATA区

<![CDATA[文本内容]]>
组成部分:
文档声明
<?xml 属性列表?>

version,版本号,必要属性

encoding,编码方式,默认值,ISO-8859-1

standalone,独立性,yes,独立,no,非独立

XML元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。XML的标签均为自定义的。

XML 标签命名规则:
XML属性

XML 元素可以在开始标签中包含属性,类似 HTML。属性 (Attribute) 提供关于元素的额外(附加)信息。XML 属性必须加引号XML属性值必须被单引号或双引号包围。

元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

id属性唯一

XML约束

DTD、XSD XML Schemas Definition

DTD:
引入dtd文档到xml文档中
内部dtd:将约束规则定义在xml文档中
外部dtd:将约束的规则定义在外部的dtd文件中
本地:

<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">

网络:

<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

示例DTD

<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<!--<!DOCTYPE students [-->
<!--		<!ELEMENT students (student*) >-->
<!--		<!ELEMENT student (name,age,sex)>-->
<!--		<!ELEMENT name (#PCDATA)>-->
<!--		<!ELEMENT age (#PCDATA)>-->
<!--		<!ELEMENT sex (#PCDATA)>-->
<!--		<!ATTLIST student number ID #REQUIRED>-->
 
<!--		]>-->
<students>
    <student number="test_0001">
        <name>tom</name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="test_002">
        <name>mike</name>
        <age>19</age>
        <sex>male</sex>
    </student>
    
</students>

填写xml文档的根元素

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

引入xsd文件命名空间. xsi:schemaLocation=”http://www.zr.cn/xml student.xsd”

为每一个xsd约束声明一个前缀,作为标识 xmlns=”http://www.zr.cn/xml

xmlns:a=”http://www.zr.cn/xml

xmlns:b=”http://www.zr.cn/xml2

在后面使用标签时,如果两个名字的文件都有相同的那个标签,则可以通过<a:标签名>来实现*

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.zr.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.zr.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="heima_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
    1.填写xml文档的根元素
    2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.zr.cn/xml  student.xsd"
    4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.zr.cn/xml"
                 xmlns:a="http://www.zr.cn/xml"
                 xmlns:b="http://www.zr.cn/xml2"
                在后面使用标签时,如果两个名字的文件都有相同的那个标签,则可以通过<a:标签名>来实现
    
 -->
 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.zr.cn/xml  student.xsd"
             xmlns="http://www.zr.cn/xml"
>
     <student number="heima_0001">
         <name>tom</name>
         <age>18</age>
         <sex>male</sex>
     </student>
         
 </students>

XSD是指XML结构定义 ( XML Schemas Definition )XML Schema 是DTD的替代品。XML Schema语言也就是XSD。XML Schema描述了XML文档的结构。可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XML Schema指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。

解析器

XML解析

将XML文档中的数据读取至内存中。

解析方式

DOM解析方式,一次性加载XML文件至内存形成DOM树,可以对文档进行CRUD操作。

SAX解析方式,simple API for XML,逐行加载XML文件至内存,边扫描边解析。

XML解析器

JAXP:sun公司提供的解析器,支持dom和sax解析方式。

DOM4J:dom解析方式。

Jsoup:dom解析方式。

PULL:Android内置XML解析器,sax解析方式。

Jsoup

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

Document:文档对象。代表内存中的dom树,获取Element对象

Elements:元素Element对象的集合。可以当做 ArrayList来使用

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():获取标签体的所有内容(包括字标签的字符串内容)

Node:节点对象,是Document和Element的父类

selector选择器

Elements select(String cssQuery),cssQuery按照以前css选择器名字来做

Xpath

利用JsoupXpath,XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言,需要Jsoup的支持。

XML解析示例

student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student number="student0001">
        <name>tom</name>
        <age>18</age>
        <sex>male</sex>
        <grade>
            <class th="chiness">100</class>
            <class th="math">98</class>
            <class th="english">99</class>
        </grade>
    </student>
    <student number="student0002">
        <name>jack</name>
        <age>14</age>
        <sex>female</sex>
    </student>
</students>

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;

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

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        //获取xml文件的路径
        String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
        //解析xml文档
        Document document = Jsoup.parse(new File(path),"UTF-8");

        //获取xml文档中的元素对象
        System.out.println("---dom方式获取文档内容");
        Elements elements = document.getElementsByTag("class");
        //遍历对象获取数据
        for(Element element : elements){
            System.out.println(element);
        }

        System.out.println("---选择器方式获取文件内容");
        elements = document.select("student[number='student0001'] > age");
        System.out.println(elements);

        System.out.println("---Xpath解析文件内容");
        JXDocument jxDocument = new JXDocument(document.getAllElements());
        List<JXNode> jxNodes = jxDocument.selN("//student//class");
        for(JXNode jxNode : jxNodes){
            System.out.println(jxNode);
        }

    }
}