aoe1231

知之为知之,不知为不知

XML入门

1、XML概念

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

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

xml功能:存储数据,① 作为配置文件;② 在网络中传输

xml与html的区别:

  • xml的标签都是自定义的,html标签是预定义的;
  • xml的语法严格,html语法松散;
  • xml是存储数据的,html是展示数据的。

2、XML语法

2.1、基本语法

  • xml文档的后缀名:.xml。
  • xml第一行必须定义为文档声明。
  • xml文档中有且仅有一个根标签。
  • 属性值必须使用引号(单双都可)引起来。
  • 标签必须正确关闭。
  • xml标签名称区分大小写。

2.2、组成部分

2.2.1、文档声明

-格式
<?xml 属性列表 ?>
属性列表:
    version:版本号,必须的属性。
    encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1。
    standalone:是否独立,取值有① yes:不依赖其它文件;② no:依赖其它文件。

如:
<?xml version="1.0" encoding="ISO-8859-1"?>

2.2.2、指令(了解)

指令:结合css来控制标签样式。

<?xml-stylesheet type="text/css" href="a.css" ?>

2.2.3、标签

标签名称自定义,规则:

  • 名称可以包含字母、数字以及其他的字符;
  • 名称不能以数字或者标点符号开始;
  • 名称不能以字母xml(或者XML、Xml等等)开始;
  • 名称不能包含空格。

2.2.4、属性

id属性值唯一。

2.2.5、文本

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

-格式
<code>
    <![CDATA[
        //文本区
    ]]]>
</code>

2.2.6、约束

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

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

  • 能够在xml中引入相关文档;
  • 能够简单地读懂约束文档。

分类:

  • DTD:一种简单的约束技术;
  • Schema:一种复杂的约束技术。

DTD:

引入dtd文档到xml文档中:① 内部dtd:将约束规则定义在xml文档中;② 外部dtd:将约束的归咋定义在外部的文件中。本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">;网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置URL">。

<?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="001">
		<name>tom</name>
		<age>18</age>
		<sex>male</sex>
	</student>
	
</students>

Schema:

<?xml version="1.0"?>
<xsd:schema xmlns="xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="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="\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="xml  student.xsd"
	4.为每一个xsd约束声明一个前缀,作为标识  xmlns="xml" 
	
	
 -->
 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="xml  student.xsd"
			 xmlns="xml"
>
 	<student number="0001">
 		<name>tom</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>

	<student number="0002">
		<name>mike</name>
		<age>18</age>
		<sex>male</sex>
	</student>
		 
 </students>

3、解析XML

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

操作xml文档:

  • 解析(读取):将文档中的数据读取到内存中。
  • 写入:将内存中的数据保存到xml文档中,持久化的存储。

解析xml的方式:

  • DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树。优点:操作方便,可以对文档进行CRUD的所有操作;缺点:占内存。
  • SAX:逐行读取,基于事件驱动的。优点:不占内存。缺点:只能读取,不能增删改。

xml常见的解析器:

  • JAXP:sun公司提供的解析器,支持dom和sax两种思想。
  • DOM4J:一款非常优秀的解析器。
  • Jsoup:Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
  • PULL:Android操作系统内置的解析器,sax方式的。

3、Jsoup的使用

3.1、Jsoup快速入门

1、导入jar包:jsoup-1.11.2.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 JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //2、获取Document对象,根据xml文档来获取
        //2.1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2.2、解析xml文档,加载文档进内存,获取dom树-->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3、获取元素对象 Element
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        //3.1、获取第一个name的element对象
        Element element = elements.get(0);
        //3.2、获取数据
        String name = element.text();
        System.out.println(name);
    }
}

3.2、Jsoup常见对象

  • Jsoup:工具类,可以解析html或xml文档,返回Document对象。
  • Document:文档对象,代表内存中的dom树。
  • Elements:元素Element对象的集合,可以当作ArrayList<Element>来使用。
  • Element:元素对象。
  • Node:结点对象。

3.2.1、Jsoup对象

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

-parse:解析html或xml文档,返回Document
Document parse(File in, String charsetName);//解析xml或html文件的。
Document parse(String in):解析xml或html字符串。
Document parse(URL url, int timeoutMillis);//通过网络路径获取指定的html或xml 的文档对象。
package xml.jsoup;

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

import java.io.File;
import java.io.IOException;
import java.net.URL;

/**
 * Jsoup对象功能
 */
public class JsoupDemo2 {
    public static void main(String[] args) throws IOException {
        //方式1:
        //2、获取Document对象,根据xml文档来获取
        //2.1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2.2、解析xml文档,加载文档进内存,获取dom树-->Document
        Document document1 = Jsoup.parse(new File(path), "utf-8");

        //方式2:
        //parse(String html):解析xml或html字符串
        String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                "\n" +
                " <students>\n" +
                " \t<student number=\"0001\">\n" +
                " \t\t<name>tom</name>\n" +
                " \t\t<age>18</age>\n" +
                " \t\t<sex>male</sex>\n" +
                " \t</student>\n" +
                "\n" +
                "\t<student number=\"0002\">\n" +
                "\t\t<name>mike</name>\n" +
                "\t\t<age>18</age>\n" +
                "\t\t<sex>female</sex>\n" +
                "\t</student>\n" +
                "\t\t \n" +
                " </students>";
        Document document2 = Jsoup.parse(str);
        //System.out.println(document2);

        //方式3:
        //parse(URL url, int timeoutMillis);//通过网络路径获取指定的html或xml 的文档对象。
        URL url = new URL("https://www.baidu.com");
        Document document = Jsoup.parse(url, 10000);
        System.out.println(document);
    }
}

3.2.2、Document对象

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

-获取Elements对象集合
Elements getElementsByTag(String tagName);//根据标签名称获取元素对象集合
Elements getElementsByAttribute(String key);//根据属性名称获取元素对象集合
Elements getElementsByAttributeValue(String key, String value);//根据对应的属性名和属性值获取元素对象集合

-获取Element对象
Element getElementById(String id);//根据id属性值获取唯一的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;

/**
 * Document/Element对象功能
 */
public class JsoupDemo3 {
    public static void main(String[] args) throws IOException {
        //1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2、获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3、获取元素对象
        //3.1、获取所有student对象
        Elements elements = document.getElementsByTag("student");
        System.out.println(elements);
        System.out.println("------------");
        //3.2、获取属性名为id的元素对象们
        Elements elements1 = document.getElementsByAttribute("id");
        System.out.println(elements1);
        System.out.println("------------");
        //3.3、获取number属性值为0001的元素对象
        Elements elements2 = document.getElementsByAttributeValue("number", "0001");
        System.out.println(elements2);
        System.out.println("------------");
        //3.4、获取id属性值为123的元素对象
        Element elementById = document.getElementById("123");
        System.out.println(elementById);
    }

[点击并拖拽以移动]

3.2.3、Elements对象

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

3.2.4、Element对象

Element:元素对象。

-获取子元素对象
Elements getElementsByTag(String tagName);//根据标签名称获取元素对象集合
Elements getElementsByAttribute(String key);//根据属性名称获取元素对象集合
Elements getElementsByAttributeValue(String key, String value);//根据对应的属性名和属性值获取元素对象集合

-获取属性值
String attr(String key);//根据属性名称获取属性值

-获取文本内容
String text();//获取文本内容
String html();//获取标签体的所有内容(包括子标签的标签和文本内容)
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 JsoupDemo4 {
    public static void main(String[] args) throws IOException {
        //1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2、获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");

        /**
         * -获取子元素对象
         * Elements getElementsByTag(String tagName);//根据标签名称获取元素对象集合
         * Elements getElementsByAttribute(String key);//根据属性名称获取元素对象集合
         * Elements getElementsByAttributeValue(String key, String value);//根据对应的属性名和属性值获取元素对象集合
         *
         * -获取属性值
         * String attr(String key);//根据属性名称获取属性值
         *
         * -获取文本内容
         * String text();//获取文本内容
         * String html();//获取标签体的所有内容,包括子标签的字符串内容
         */
        //通过Document对象获取所有的name标签
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        System.out.println("---------------");

        //通过Element对象获取子标签对象
        Element element_student = document.getElementsByTag("student").get(0);
        Elements ele_name = element_student.getElementsByTag("name");
        System.out.println(ele_name.size());
        System.out.println("---------------");

        //获取student对象的属性值
        String number = element_student.attr("nUmBer");//不区分大小写
        System.out.println(number);
        System.out.println("---------------");

        //获取文本内容
        String text1 = ele_name.text();//获取所有子标签的所有纯文本内容
        String html = ele_name.html();//获取标签体的所有内容(包括子标签的标签和文本内容)
        System.out.println(text1);
        System.out.println(html);
    }
}

3.2.5、Node对象

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

3.3、快捷查询方式

3.3.1、selector:选择器

使用的方法:
Elements select(String cssQuery);
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 JsoupDemo5 {
    public static void main(String[] args) throws IOException {
        //1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2、获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");

        //3、查询name标签
        Elements elements1 = document.select("name");
        System.out.println(elements1);
        System.out.println("--------------------");

        //4、查询id值为123的元素
        Elements elements2 = document.select("#123");
        System.out.println(elements2);
        System.out.println("--------------------");

        //5、获取number属性值为0001的student标签的age子标签
        //5.1、获取number属性值为0001的student标签
        Elements elements3 = document.select("student[number='0001']");
        System.out.println(elements3);
        System.out.println("--------------------");
        //5.2、获取子标签
        Elements elements4 = document.select("student[number='0001'] > age");
        System.out.println(elements4);
        System.out.println("--------------------");
    }
}

3.3.2、XPath:XML路径语言

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

注意:

  • 使用Jsoup的XPath需要额外导入jar包(JsoupXpath-0.3.2.jar)。
  • 查询w3cschool参考手册,使用xpath的语法完成查询。
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 JsoupDemo6 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //1、获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2、获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");

        //3、根据document对象来创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //4、结合xpath语法查询
        //4.1、查询所有的student标签://
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for(JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //4.2、查询所有student标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        for(JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //4.3、查询student标签下带有id属性的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        for(JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //4.4、查询student标签下带有id属性的name标签,并且id属性值为123
        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='123']");
        for(JXNode jxNode : jxNodes4) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
    }
}

 

posted on   啊噢1231  阅读(40)  评论(0编辑  收藏  举报

导航

统计信息

回到顶部
点击右上角即可分享
微信分享提示

1、XML概念
2、XML语法
2.1、基本语法
2.2、组成部分
2.2.1、文档声明
2.2.2、指令(了解)
2.2.3、标签
2.2.4、属性
2.2.5、文本
2.2.6、约束
3、解析XML
3、Jsoup的使用
3.1、Jsoup快速入门
3.2、Jsoup常见对象
3.2.1、Jsoup对象
3.2.2、Document对象
3.2.3、Elements对象
3.2.4、Element对象
3.2.5、Node对象
3.3、快捷查询方式
3.3.1、selector:选择器
3.3.2、XPath:XML路径语言