web_xml

本文详细介绍了XML约束、DTD、schema及其实例,展示了如何使用DOM和SAX解析器处理student.xml,并探讨了Jsoup在不同场景的应用,包括快速入门、选择器查询和Document/Element对象操作。

xml

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

xml_dtd_约束

在这里插入图片描述

student.dtd 约束文件

<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>

student.xml文件

<?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="s001">

		<name>zhangsan</name>
		<age>23</age>
		<sex>hehe</sex>
	</student>
	<student number="s002">
		<name>lisi</name>
		<age>24</age>
		<sex>female</sex>
	</student>
</students>

解读:

		<!ELEMENT students (student+) >   //元素sudents 出现一次或者多次  根标签为students
		<!ELEMENT student (name,age,sex)>//student标签必须包含 name,age,sex
		<!ELEMENT name (#PCDATA)>//name的属性必须为字符串
		<!ELEMENT age (#PCDATA)>//name的属性必须为字符串
		<!ELEMENT sex (#PCDATA)>//name的属性必须为字符串
		<!ATTLIST student number ID #REQUIRED> //student中id的number的属性必须唯一

schema

student.xsd文件

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.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> 

students.xml文件

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

</students>

解读
在这里插入图片描述

<a:students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

			xsi:schemaLocation="
			http://www.itcast.cn/xml1  student.xsd
			http://www.itcast.cn/xml2  student2.xsd

"
			  xmlns:a="http://www.itcast.cn/xml"
			  xmlns:b="http://www.itcast.cn/xml"
>
	<a:student number="heima_0001">
		<a:name>tom</a:name>
		<a:age>18</a:age>
		<a:sex>male</a:sex>
	</a:student>

</a:students>
  • 在students前面添加“a:”,后面的所有标签都要加上前缀"a:";
  • xsi:schemaLocation中添加约束文档的地址;
  • xmlns="http://www.itcast.cn/xml"默认无前缀.
  • xmlns:a="http://www.itcast.cn/xml"默认有前缀。当有多个约束文档的时候,为了区分,可以添加上前缀。

在这里插入图片描述
在这里插入图片描述

  • DOM运用在服务器端,SAX运用在移动端。

常见的解析器Jsoup

在这里插入图片描述

快速入门

<?xml version="1.0" encoding="utf-8" ?>
<students>
<student number="heima_0001">
	<name>Tom</name>
	<age>12</age>
	<sex>male</sex>
</student>

<student number="heima_0002">
	<name>Tom2</name>
	<age>123</age>
	<sex>female</sex>
</student>
</students>
package cn.itcast.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 {
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path=JsoupDemo01.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);

    }

}

xml_解析_Jsoup对象

Jsoup

package cn.itcast.xml.jsoup;

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

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

public class JsoupDemo02 {
    public static void main(String[] args) throws IOException {
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document= Jsoup.parse(new File(path),"utf-8");
        //System.out.println(document);//html文档

        //3.parse(String html):解析xml或HTML字符串 ;
        //str中的字符串就是从xml中复制的xml文件的内容;
        String str="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
                "<students>\n" +
                "<student number=\"heima_0001\">\n" +
                "\t<name>Tom</name>\n" +
                "\t<age>12</age>\n" +
                "\t<sex>male</sex>\n" +
                "</student>\n" +
                "\n" +
                "<student number=\"heima_0002\">\n" +
                "\t<name>Tom2</name>\n" +
                "\t<age>123</age>\n" +
                "\t<sex>female</sex>\n" +
                "</student>\n" +
                "</students>";
        Document document1=Jsoup.parse(str);
        System.out.println(document);//将xml文件解析成HTML文档


        //3.parse(URL url,int timeoutMillis):通过网络路径获取指定的HTML或者xml的文档对象
        URL url=new URL("https://baike.baidu.com/item/%E7%A8%8B%E5%BA%8F%E5%91%98/62748?fr=aladdin");
        Document document2=Jsoup.parse(url,10000);
        System.out.println(document2);

    }
}

  • 第一种是常见的运用;第二种了解即可;第三种运用在网络爬虫程序上。

Document对象

在这里插入图片描述

package cn.itcast.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 JsoupDemo03 {
    public static void main(String[] args) throws IOException {
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document= Jsoup.parse(new File(path),"utf-8");
        //System.out.println(document);//html文档
        //3.获取元素对象
        //3.1获取所有student对象
        Elements elements=document.getElementsByTag("student");
        System.out.println(elements);//将所有的标签打印了出来


        System.out.println("------------------------");
        //3.获取元素的对象了
        //3.1获取所有student对象
        Elements elements1=document.getElementsByAttribute("id");
        System.out.println(elements1);
        System.out.println("------------------------");

        //3.2 获取number属性值为heima_0001元素对象
        Elements elements2=document.getElementsByAttributeValue("number","heima_0001");
        System.out.println(elements2);
        System.out.println("------------------------");

        //3.3获取id属性值的元素对象
        Element itcast=document.getElementById("cast");
        System.out.println(itcast);

    }
}

Element对象

在这里插入图片描述

package cn.itcast.xml.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.w3c.dom.ls.LSOutput;

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

public class JsoupDemo4 {
    public static void main(String[] args) throws IOException {
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document= Jsoup.parse(new File(path),"utf-8");

        //System.out.println(document);//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());

        //获取student对象的属性值
        String number=element_student.attr("NUMBER");
        System.out.println(number);
        System.out.println("------------");

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

    }

}


在这里插入图片描述

Jsoup根据选择器查询

  • 快捷查询方式:
  • 1.selector:选择器
    **使用的方法:Elements select(String cssquery)
    ***语法:参考Selector类中定义的语法
package cn.itcast.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 JsoupDemo5 {
    public static void main(String[] args) throws IOException {
        //2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树--->Document
        Document document= Jsoup.parse(new File(path),"utf-8");
        //3.查询name标签

        Elements elements=document.select("name");
        System.out.println(elements);
        System.out.println("--------------------------------");

        //4.查询id值为itcast的元素
        Elements elements1=document.select("#itcast");
        System.out.println(elements1);
        System.out.println("--------------------------------");
        //5.获取student标签并且number属性值为heima_0001的age子标签
        //5.1获取student标签并且number属性值为heima_0001
        Elements elements2=document.select("student[number=\"heima_0001\"]");
        System.out.println(elements2);
        System.out.println("--------------------------------");
        //5.2获取student标签并且number属性值为heima_0001的age子标签
        Elements elements3=document.select("student[number=\"heima_0001\"] > age" );
        System.out.println(elements3);

    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值