1、XML概念
  XML:Extensible Markup Language 可扩展标记语言。(基本介绍见视频2)

* 可扩展:标签都是自定义的。 <user>  <student>* 功能* 存储数据1. 配置文件2. 在网络中传输* xml与html的区别1. xml标签都是自定义的,html标签是预定义。2. xml的语法严格,html语法松散3. xml是存储数据的,html是展示数据* w3c:万维网联盟

2、XML语法

  • 基本语法:(如果想验证语法是否正确,我们可以将xml文件拖到浏览器中,如果浏览器可以解析且不报错,那么我们的xml文档就是正确的)
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明(注意,这里所说的第一行就是真正意义上的第一行,第一行必须是文档声明)
3. xml文档中有且仅有一个根标签(如下面快速入门中,<users>就是根标签)
4. 属性值必须使用引号(单双都可)引起来
5. 标签必须正确关闭
6. xml标签名称区分大小写
  • 快速入门
<?xml version='1.0' ?>
<users><user id='1'><name>zhangsan</name><age>23</age><gender>male</gender><br/></user><user id='2'><name>lisi</name><age>24</age><gender>female</gender></user>
</users>

  这里注意,如果是自闭和的标签,“/”要写在标签名后面,比如
,这个标签在HTML里面是换行的意思,但是在这里只是我们定义的一个自闭和的标签。而其他标签,“/”则写在结束标签名的前面,比如。

  • 组成部分:
1. 文档声明1. 格式:<?xml 属性列表 ?>2. 属性列表:* version:版本号,必须的属性(version的值默认写作1.0即可)* encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1,但是我们xml文件真实的编码方式是GBK(我们在notepad++中设置文件的编码方式为ANSI,ANSI就是GBK编码的集合,具体参考文章:[各类编码方式的区别](https://blog.csdn.net/lr1916417519/article/details/83659226),反正在notepad中设置使用什么方式编码,就需要告诉浏览器使用什么方式解码。比如utf-8也可以解析中文,我们也可以使用utf-8编码解码),XML文件告知浏览器使用ISO-8859-1取解析GBK编码的文件,如果出现中文字符,就会解析错误。那么想要浏览器能解析中文,必须在文档声明中使用encoding属性设置告知浏览器此XML解码方式为GBK。现在如果使用IDEA工具,这个工具会自动识别我们当前的编码方式并解码,不需要我们指定encoding属性* standalone:是否独立(现在这个值都不会设置)* 取值:* yes:不依赖其他文件* no:依赖其他文件
2. 指令(了解):结合css可以控制标签的样式(早起xml是用来替代html的,但是现在一般只使用xml来存储,不需要与css结合了)* <?xml-stylesheet type="text/css" href="a.css" ?>
3. 标签:标签名称自定义的* 规则:* 名称可以包含字母、数字以及其他的字符 * 名称不能以数字或者标点符号开始 * 名称不能以字母 xml(或者 XML、Xml 等等)开始 * 名称不能包含空格 4. 属性:id属性值唯一
5. 文本:* CDATA区:在该区域中的数据会被原样展示* 格式:  <![CDATA[ 数据 ]]>

  代码演示

<?xml version='1.0' encoding='utf-8' standalone='no' ?>
<!--
<?xml-stylesheet type="text/css" href="a.css" ?>
使用这个文件之后,我们发现xml文件被解析,就像浏览器解析html文件一样,不显示xml代码,只显示相应的内容
-->
<!--xml注释与html注释格式相同--><users><user id='1'><name>张三</name><age>23</age><gender>male</gender><br/></user><user id='2'><name>lisi</name><age>24</age><gender>female</gender><!--下面是代码区域--><code><!--if(a < b && a>b){}--><!--我们发现上面的代码报错,因为<,>等符号是特殊字符,需要使用转义字符表示(转义字符与html相同)虽然使用转义字符可以表示,但是这显然比较麻烦。我们可以使用CDATA区使得数据原样展示--><!--if(s &lt; b &amp;&amp; a &gt; c){}--><![CDATA[if(a < b && a>b){}]]]></code></user>
</users>

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

  关于XML的约束的相关概念,见视频5。

  XML文件就相当于一款软件的配置文件,我们使用一款软件,如果要设置一些个性化的信息,就必须通过XML文件,软件读取相应XML文件,才能获知用户的个性化设置信息。既软件使用者编写XML文件,软件解析XML文件。
  当然,这里所说的软件和用户不是普通的软件和用户,我们所说的软件是半成品软件,既框架。而用户指的就是使用框架进行开发的程序员。既程序员使用XML来与框架进行交流,从而使用框架进行开发。
  而所谓的约束文档(说明文档),就是用来规定相应XML文档的书写规则。约束文档是由软件(框架)提供的。我们作为程序员,只需要看懂约束文档,并根据约束文档的规则将XML文档编写出来即可。

* 作为框架的使用者(程序员):1. 能够在xml中引入约束文档(只有引入约束文档,才能约束相应的XML文档)2. 能够简单的读懂约束文档(高级开发工具有很多提示)* 分类:1. DTD:一种简单的约束技术2. Schema:一种复杂的约束技术

  将IDEA中普通文件夹设置为资源部包(蓝色),点击想设置的文件夹,右键-Mark Directory as-source,这样就会将普通文件夹设置为蓝色的资源包。只有资源包才可以设置多层的包Package

1)DTD文档

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

  DTD文档的阅读方式,见视频6-1.30。
  相应的dtd约束代码如下:

<!--dtd约束文档:student.dtd-->
<!ELEMENT students (student*) >  <!--定义一个students标签,里面可以存放*(零个或者多个)student子标签-->
<!ELEMENT student (name,age,sex)>   <!--定义一个student标签,里面可以存放一个name、age或sex子标签,并且子标签必须按照定义的顺序出现-->
<!ELEMENT name (#PCDATA)>   <!--定义一个name标签,里面可以存放#PCDATA,既字符串数据。下面的age、sex相同-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>  <!--声明student标签的属性,属性名称为number,而属性类型为ID,ID表示number的属性值必须唯一。#REQUIRED表示属性number必须出现--><!--
这里使用ELEMENT定义标签,使用ATTLIST定义属性
-->

  下面是相应的使用dtd约束的文档

<!--xml文件student.xml-->
<?xml version="1.0" encoding="UTF-8" ?>     <!--文档声明-->
<!--先引入dtd约束文档到当前的xml文档中-->
<!DOCTYPE students SYSTEM "student.dtd"><!--内部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">     <!--我们发现这里number的值前面不带英文字母会报错,也不知道为啥--><name>zhangsan</name><age>23</age><sex>male</sex></student><student number="s002"><name>lisi</name><age>24</age><sex>female</sex></student>
</students>

2)schema文档

* Schema:* 引入: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"xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"xmlns="http://www.itcast.cn/xml">

  首先是dtd约束的局限性(视频7开始的解析),schema相对于dtd来说,它可以对内容进行限定。(schema文档相对较为复杂,以后使用可以参考视频)
  首先是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"/>      <!--声明一个student元素,类型是studentsType,下面会定义studentsType这个类型--><xsd:complexType name="studentsType"><xsd:sequence>      <!--这里声明Sequence,表示按顺序出现下面元素--><!--下面一行声明student标签,类型为studentType类型,最少出现minOccurs 0次,最多出现maxOccurs无限次--><xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType>      <!--这里对前面定义的studentsType这个类型进行定义--><xsd:complexType name="studentType"><xsd:sequence>  <!--这里声明Sequence,表示按顺序出现下面元素--><!--下面定义3个元素,并指定这三个元素的类型--><xsd:element name="name" type="xsd:string"/>    <!--姓名是xsd:string字符串类型,这是是schema约束规定的类型,不需要我们自定义--><xsd:element name="age" type="ageType" />       <!--年龄定义ageType类型--><xsd:element name="sex" type="sexType" />       <!--性别定义sexType类型--></xsd:sequence><!--定义student标签的属性number,类型是numberType类型,必须出现--><xsd:attribute name="number" type="numberType" use="required"/></xsd:complexType>      <!--这里对前面定义的studentType这个类型进行定义--><!--下面3个类型是简单类型,简单类型内部不定义其他标签,并且简单类型有相应的值,可以对值进行限定--><xsd:simpleType name="sexType"><xsd:restriction base="xsd:string">     <!--基本的限定类型为schema自定义的字符串string类型--><xsd:enumeration value="male"/>     <!--使用枚举类型限定sexType类型的值,要么是female,要么是male--><xsd:enumeration value="female"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="ageType"><xsd:restriction base="xsd:integer">        <!--限定ageType的值是integer类型,数字--><xsd:minInclusive value="0"/>   <!--限制最小值是0--><xsd:maxInclusive value="256"/>     <!--限制最大值为256--></xsd:restriction></xsd:simpleType>       <xsd:simpleType name="numberType"><xsd:restriction base="xsd:string">     <!--限定numberType类型的值为字符串string类型--><xsd:pattern value="heima_\d{4}"/>      <!--限制这个numberType类型值的格式必须为“heima_”+4个数字--></xsd:restriction></xsd:simpleType></xsd:schema><!--schema文档本身就是一个xml文档。这个文档看起来很复杂,其实与前面的dtd文档类似-->

  其次是使用schema约束student.xsd文档的xml文件student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--
下面是schema文档的引入规则(比较复杂,其实我们看得懂即可,以后使用的时候配置文件一般会提供,我们修改即可)1.填写xml文档的根元素2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"显示当前约束的版本,这是一个版本的命名空间,并给这个命名空间设置前缀为xsi。这是一种固定格式3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"第二部分是当前schema约束文档的路径,并使用命名空间给schema文档的路径起一个名字。以后如果我们想要使用schema文档的元素,必须加上命名空间。如想使用students标签,必须写作“http://www.itcast.cn/xml:students”,如果都要加上会很麻烦。因此在下面我们给命名空间加一个前缀。4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml"比如我们声明一个前缀“xmlns:a="http://www.itcast.cn/xml"”,以后我们使用student.xsd约束的元素的时候,就使用a表示命名空间,如“a:students”使用的所有student.xsd文档的文件必须都要写a:当我们只引入一个约束文档的时候,也可以不给命名空间加前缀,而是元素前面什么都不写,默认使用了当前唯一的命名空间。如果我们引入多个约束文档,必须给约束文档定义命名空间。而2个元素文档的标签元素可能相同,必须使用命名空间来区分这些约束。如果使用命名空间,看起来会很长,因此我们可以给命名空间起一个前缀名,这样看起来就简洁很多-->
<a:students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"xmlns:a="http://www.itcast.cn/xml"><a:student number="heima_0001"><a:name>zhangsan</a:name><a:age>23</a:age><a:sex>male</a:sex></a:student></a:students>

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

  • 我们对xml文档会进行2种操作——解析与写入(解析使用得比较多,而写入用得比较少)
1. 解析(读取):将文档中的数据读取到内存中
2. 写入:将内存中的数据保存到xml文档中。持久化的存储
  • 解析xml的方式:服务器端一般使用DOM思想,而在移动端会使用SAX思想。(一般标记型语言文档也是下面2类解析方式)
1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树* 优点:操作方便,可以对文档进行CRUD的所有操作* 缺点:占内存
2. SAX:逐行读取,基于事件驱动的。(SAX的解析思想:视频8-6.00)* 优点:不占内存。* 缺点:只能读取,不能增删改
  • 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 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。(也可以用来解析XML)
* 快速入门:* 步骤:1. 导入jar包(资料里面有)2. 获取Document对象3. 获取对应的标签Element对象获取Document对象的方式有3种(下面代码我们使用第一种)1) 从一个URL,文件或字符串中解析HTML;2) 使用DOM或CSS选择器来查找、取出数据;3) 可操作HTML元素、属性、文本;4. 获取数据(比如我们可以获取文本内容等)

  首先,同样记得将对应的jar包放入一个文件夹(如libs),并将这个文件add as library。然后我们创建java的类,使用java语言来对XML文档进行解析**(java可以调用用于解析XML的相关jar包的功能,从而实现XML的解析)。**

  • 下面是快速入门的代码
      相应的需要解析的XML文件——student.xml
<?xml version="1.0" encoding="UTF-8" ?><!--这个XML文档没有指定相关的约束-->
<students><student number="heima_0001"><name id="itcast"><xing>张</xing><ming>三</ming></name><age>18</age><sex>male</sex></student><student number="heima_0002"><name>jack</name><age>18</age><sex>female</sex></student></students>

  解析XMl文档的java代码

package lkj_analysis_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 JsoupDemo2
{public static void main(String[] args) throws IOException{//1、导入jsoup的相关jar包(完成)//2、获取Document对象。我们通过xml文档来获取该文档的Document对象。//首先通过当前的jsoupDemo1的Class对象获取类加载器,再使用类加载器的getResource方法获取相关xml文档的URL,根据URL的getPath方法获取此URL的String路径//2.1获取student.xml的pathString path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();//2.2解析xml文档,加载文档进内存,获取dom树--->Document,通过Jsoup的parse方法,同时可以指定解析字符集(字符串必须与XML文件的字符集一致)Document dom = Jsoup.parse(new File(path), "utf-8");//这里接收File对象,必须将XML文档的path转换为File对象。//3.获取元素对象 Element——public class Elements extends ArrayList<Element>(将Elements看做一个存放Element元素的ArrayList集合即可)Elements elements = dom.getElementsByTag("name");System.out.println(elements.size());//既然Elements可以看作一个ArrayList集合,长度使用size()方法for(int x=0 ; x<elements.size() ; x++){//3.1获取name的Element对象Element element = elements.get(x);//使用ArrayList集合的get方法//3.2获取数据String text = element.text();System.out.println(text);}}
}

Jsoup各个对象的详细使用方法(参考jsoup.index文档)

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):通过网络路径获取指定的html或xml的文档对象

  示例代码

package lkj_analysis_jsoup;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import java.io.File;
import java.io.IOException;
import java.net.URL;/*** Jsoup对象功能:解析xml或html文档,并返回document对象* parse方法的三个重载形式*/
public class JsoupDemo2
{public static void main(String[] args) throws IOException{//1、parse​(File in, String charsetName):解析xml或html文件的。String path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();Document doc1 = Jsoup.parse(new File(path), "utf-8");
//        System.out.println(doc1);//将整个student.xml文档的内容显示出来//2.parse​(String html):解析xml或html字符串String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +"<students>\n" +"\t<student number=\"heima_0001\">\n" +"\t\t<name id=\"itcast\">\n" +"\t\t\t<xing>张</xing>\n" +"\t\t\t<ming>三</ming>\n" +"\t\t</name>\n" +"\t\t<age>18</age>\n" +"\t\t<sex>male</sex>\n" +"\t</student>\n" +"\t<student number=\"heima_0002\">\n" +"\t\t<name>jack</name>\n" +"\t\t<age>18</age>\n" +"\t\t<sex>female</sex>\n" +"\t</student>\n" +"</students>";//这里直接将student.xml的内容复制过来即可Document doc2 = Jsoup.parse(str);
//        System.out.println(doc2);//将整个student.xml文档的内容显示出来//3.parse​(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象(多用于解析网络HTML页面)URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");//代表网络中的一个资源路径。我们在这里解析一个html页面演示Document doc3 = Jsoup.parse(url, 10000);//第二个参数设置的是超时的时间System.out.println(doc3);//打印出对应页面的html源代码}
}

2)Document:文档对象。代表内存中的dom树(Document对象继承Elements对象,其获取Elements的方法也是继承自这个Elements对象

* 在XML中,Document对象主要用来获取Element对象* getElementById​(String id):根据id属性值获取唯一的element对象* getElementsByTag​(String tagName):根据标签名称获取元素对象集合* getElementsByAttribute​(String key):根据属性名称获取元素对象集合* getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合

  示例代码

package lkj_analysis_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;
import java.net.URL;public class JsoupDemo2
{public static void main(String[] args) throws IOException{//获取Document对象String path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();Document doc = Jsoup.parse(new File(path), "utf-8");//3.获取元素对象了。//3.1获取所有student对象的Elements集合Elements elements = doc.getElementsByTag("student");
//        System.out.println(elements);//打印出2个student对象的源代码System.out.println("-----------");//3.2根据id的属性值,获取相应的的元素对象的集合(返回单个的Elements对象,因为id的值唯一)Element itcast = doc.getElementById("itcast");
//        System.out.println(itcast);//打印id值为“itcast”的元素的代码System.out.println("-----------");//3.3 获取属性名为id的元素对象们(既获取包含id属性的标签)Elements elements1 = doc.getElementsByAttribute("id");
//        System.out.println(elements1);//只要标签中有包含id属性,就都会被打印出来System.out.println("-----------");//3.4获取 number属性值为heima_0001的元素对象Elements elements2 = doc.getElementsByAttributeValue("number", "heima_0001");//根据标签属性以及属性值查找标签System.out.println(elements2);//属性值number值为“heima_0001”的标签会被打印System.out.println("-----------");}
}
  1. Elements:元素Element对象的集合。可以当做 ArrayList来使用
      这个Elements对象只是一个存储Element元素的ArrayList集合。

  2. Element:元素对象

1. 获取子元素对象(与前面通过Document获取标签集合的方法相同,但是这里只能获取一个标签内的子标签)* getElementById​(String id):根据id属性值获取唯一的element对象* getElementsByTag​(String tagName):根据标签名称获取元素对象集合* getElementsByAttribute​(String key):根据属性名称获取元素对象集合* getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合//下面的方法是Element对象继承其父类Node对象的方法
2. 获取属性值* String attr(String key):根据属性名称获取属性值3. 获取文本内容* String text():获取文本内容* String html():获取标签体的所有内容(包括子标签的字符串内容)

  示例代码

package lkj_analysis_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;
import java.net.URL;public class JsoupDemo2
{public static void main(String[] args) throws IOException{//获取Document对象String path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();Document doc = Jsoup.parse(new File(path), "utf-8");//通过Document对象获取name标签,获取所有的name标签,可以获取到两个Elements elements = doc.getElementsByTag("name");//包含所有名为name的标签System.out.println(elements.size());System.out.println("----------------");//通过Element对象获取子标签对象Element element_student = doc.getElementsByTag("student").get(0);//获取第一个名为“student”的元素Elements ele_name = element_student.getElementsByTag("name");//获取这个“student”标签下的名为name的标签System.out.println(ele_name.size());//只能获取到一个nameSystem.out.println("----------------");//获取student对象的属性值//这个方法不区分大小写String number = element_student.attr("number");//根据student标签的number属性名,获取该number属性的值System.out.println(number);System.out.println("------------");//获取student标签下子标签name标签的相应值String text = ele_name.text();//获取name标签下的相应的纯文本String html = ele_name.html();//获取name标签体的所有内容(包括子标签的字符串内容,包括子标签的标签以及文本)System.out.println(text);System.out.println(html);}
}

5)Node:节点对象

* 是Document和Element的父类,Node里面定义了很多方法

*快捷查询方式:

  使用上面的getElement方法,如果我们想要查询某个标签,必须一级一级查询,很麻烦。而Jsoup提供了2个便捷的查询方法

  1. selector:选择器(根据类似于HTML中的选择器来查询XML中的标签元素)
* 使用的方法:Elements  select​(String cssQuery)(这个方法是Element类下的方法)
* 使用选择器查询的语法:参考Selector类中定义的选择器的语法(查询Jsoup文档)

  代码示例

package lkj_analysis_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;
import java.net.URL;public class JsoupDemo2
{public static void main(String[] args) throws IOException{//获取Document对象String path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();Document doc = Jsoup.parse(new File(path), "utf-8");//虽然select方法是Element类中的方法,但是Document对象继承自Element对象,因此一般我们使用Document对象来调用select方法//查询name标签/* 类似于CSS中的元素选择器,如html的div选择器。div{}*/Elements elements = doc.select("name");//这里查询的格式:直接使用标签名
//        System.out.println(elements);//将xml文档中name标签全部查询出来System.out.println("----------------");//4.查询id值为itcast的元素。类似于CSS的id选择器,查询的格式为:#id名Elements elements1 = doc.select("#itcast");
//        System.out.println(elements1);//将id名为“itcast”的元素全部查询出来System.out.println("----------------");//5.获取student标签并且number属性值为heima_0001的age子标签(这里是元素选择器结合属性选择器)//5.1.获取student标签并且number属性值为heima_0001Elements elements2 = doc.select("student[number=\"heima_0001\"]");//这里既可以使用转义字符\",也可以直接使用'
//        System.out.println(elements2);System.out.println("----------------");//5.2获取student标签并且number属性值为heima_0001的age子标签Elements elements3 = doc.select("student[number='heima_0001'] > age");System.out.println(elements3);}
}
  1. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
      XPath是一门对XML树形结构进行直接操作的语言。因此在java中使用的时候,需要导入额外的jar包。
      这里相当于是用Jsoup先获取XML文档的Document对象,然后使用XPath的jar包提供的工具,结合java代码来获取XML文档Document树的某一些节点。
 使用Jsoup的Xpath需要额外导入jar包。(注意使用前导入“JsoupXpath-0.3.2.jar”并add as library)查询w3cshool参考手册,使用xpath的语法完成查询

  代码示例

package lkj_analysis_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 org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;/*** XPath查询*/
public class JsoupDemo2
{public static void main(String[] args) throws IOException, XpathSyntaxErrorException{//获取Document对象String path = JsoupDemo2.class.getClassLoader().getResource("haha/student.xml").getPath();Document doc = Jsoup.parse(new File(path), "utf-8");//3.根据document对象,创建JXDocument对象JXDocument jxDoc = new JXDocument(doc);//4.结合xpath语法查询//4.1查询所有student标签List<JXNode> jxNodes1 = jxDoc.selN("//student");//查询返回的是存储JXNode节点的List集合//这个JXNode对象可以用来获取对应标签的各种成分for(JXNode jxNode : jxNodes1 )//foreach快捷键:iter+回车{//            System.out.println(jxNode);}System.out.println("--------------------");//4.2查询所有student标签下的name标签List<JXNode> jxNodes2 = jxDoc.selN("//student/name");for(JXNode jxNode : jxNodes2){//            System.out.println(jxNode);}System.out.println("--------------------");//4.3查询student标签下带有id属性的name标签List<JXNode> jxNodes3 = jxDoc.selN("//student/name[@id]");for(JXNode jxNode : jxNodes3){//            System.out.println(jxNode);}System.out.println("--------------------");//4.4查询student标签下带有id属性的name标签 并且id属性值为itcastList<JXNode> jxNodes4 = jxDoc.selN("//student/name[@id='itcast']");for(JXNode jxNode : jxNodes4){System.out.println(jxNode);}}
}

黑马就业班(02.JavaWeb+项目实战\04.XML)——XML相关推荐

  1. 黑马就业班(02.JavaWeb+项目实战\18.LinuxNginx)

    在Windows上复制的的内容,在CRT中鼠标点击右键可以黏贴.同样,在CRT中选中内容(选中就算复制),在CRT的其他地方右键就可以黏贴,在Windows直接黏贴. 今日内容 1. Linux上软件 ...

  2. 拉钩网前端项目实战04

    拉钩网前端项目实战 拉钩网前端项目实战04 banner和content设计 一.banner部分设计 1.html部分 <div class="banner">< ...

  3. Python项目实战 —— 04. 淘宝用户行为分析

    Python项目实战 Python项目实战--目录 Python项目实战 -- 04. 淘宝用户行为分析 一.背景 二.解题思路 三.数据分析 3.1 数据清洗 3.2 数据分析 3.2.1 用户整体 ...

  4. ✨JavaWeb项目:实战亲自动手手敲上线小项目部分功能的第一天✨

    系列链接: ✨JavaWeb项目实战亲自动手手敲上线小项目的第一天✨ ✨JavaWeb项目实战亲自动手手敲上线小项目的第二天✨ ✨JavaWeb项目实战亲自动手手敲上线小项目的第三天✨ ✨JavaWe ...

  5. 【JavaWeb】JavaWeb项目实战——品牌后台管理系统

    JavaWeb项目实战--品牌后台管理系统 项目概述 功能介绍 成果展示 项目实现 使用Maven构建项目 Maven介绍 具体操作 使用Mybatis封装对数据库的操作 在Mysql中建表,并添加数 ...

  6. Java就业方向和自学提升方法总结黑马就业班资源分享

    权威统计机构统计在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%.JAVA工程师的薪水相对较高,通常来说,具有3~5年开发经验的工程师,拥有年薪10万元是很正常的一个 ...

  7. 【Python飞机大战游戏实战+笔记】黑马程序员Python教程项目实战记录【超详细】

    博主在哔哩哔哩上学习了黑马程序员的python教程,并且完成了老师讲的项目实战,为了巩固知识点通过这篇博客来记录一下. 目录 1. 创建python项目+pygame模块下载 1.1 创建项目 1.2 ...

  8. javaweb项目实战(附有源码)

    这个代码是我做微信小程序的时候,专门用java做的web项目,主要是为前端提供接口,便于前端调用数据 如果有想要参考javaweb项目如何做的小伙伴,可以到github上下载,github上有前端和后 ...

  9. javaweb项目实战--学生管理系统

    准备工作 所使用到的技术: 前端–html css javascript 后端–tomcat servlet jsp el jdbc mybatis 项目结构: 实现原理: 1.登录页面的逻辑结构 2 ...

最新文章

  1. app启动调用的api
  2. Swift 3.1新改动
  3. [OS复习]存储管理1
  4. boost::mpi模块reduce() 集合的性能测试
  5. 订单状态 css_CSS状态2019
  6. vs怎么写html5页面,怎么使用vscode写html5
  7. JavaScript 特殊字符
  8. IDEA配置使用阿里云maven仓库
  9. vijos-1447 开关灯泡-大整数开方算法
  10. 初识SaltStack
  11. 华为荣耀立方中播放群晖nas中保存的视频
  12. 混淆电路的优化:PP、Free XOR、GRR
  13. matlab纹理特征提取方法,基于共生矩阵纹理特征提取
  14. Oracle 校验统一社会信用代码函数
  15. 气象大数据平台(天擎)数据读取方法(python)(地面资料下载)
  16. 全局设置webView 的 userAgent
  17. 巧用Excel笔画排序,实现计算汉字笔画数
  18. 笔记本电脑网络图标丢失解决流程
  19. 帝国根目录查阅 帝国CMS根目录一览表 ECMC根目录都是什么意思?
  20. 零基础HTML入门教程(11)--初识VSCode

热门文章

  1. Hadoop集群环境搭建(超详细)
  2. 关于BAPI_CONTRACT_CREATEFROMDATA涉及使用价格
  3. C语言 指针数组和指向指针的指针
  4. java中person作用_Java题目:建立一个人类(Person)和学生类(Student) 功能要求:
  5. 内置CRC于文本文件中的方法
  6. Xilinx AXI Central Direct Memory Access (CDMA)手册笔记
  7. 人工智能还能研究古文字?
  8. JAVA开发工程师是什么意思?
  9. dbd/oracle,linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBDOracle.pm in @INC 的解决办法...
  10. MySQL 8.0 OCP (1Z0-908)有中文考试了