xml概念语法解析

XML

	1. 概念
	2. 语法
	3. 解析

XML:

1. 概念:Extensible Markup Language 可扩展标记语言
	* 可扩展:标签都是自定义的。 <user>  <student>

	* 功能
		* 存储数据
			1. 配置文件
			2. 在网络中传输
	* xml与html的区别
		1. xml标签都是自定义的,html标签是预定义。
		2. xml的语法严格,html语法松散
		3. xml是存储数据的,html是展示数据

	* w3c:万维网联盟

2. 语法:
	* 基本语法:
		1. xml文档的后缀名 .xml
		2. xml第一行必须定义为文档声明
		3. xml文档中有且仅有一个根标签
		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>
			
		```

组成部分
1. 文档声明
1. 格式:<?xml 属性列表 ?>
2. 属性列表:
* version:版本号,必须的属性
* encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
* standalone:是否独立
* 取值:
* yes:不依赖其他文件
* no:依赖其他文件
2. 指令(了解):结合css的
* <?xml-stylesheet type="text/css" href="a.css" ?>
3. 标签:标签名称自定义的
* 规则:
* 名称可以包含字母、数字以及其他的字符
* 名称不能以数字或者标点符号开始
* 名称不能以字母 xml(或者 XML、Xml 等等)开始
* 名称不能包含空格
4. 属性:
id属性值唯一
5. 文本:
* CDATA区:在该区域中的数据会被原样展示
* 格式: <![CDATA[ 数据 ]]>

在这里插入图片描述

	* 约束:规定xml文档的书写规则
		* 作为框架的使用者(程序员):
			1. 能够在xml中引入约束文档
			2. 能够简单的读懂约束文档
		
		* 分类:
			1. DTD:一种简单的约束技术
			2. Schema:一种复杂的约束技术


		* DTD:
			* 引入dtd文档到xml文档中
				* 内部dtd:将约束规则定义在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>male</sex>
	   </student>
	   <student number="s002">
	       <name>lisi</name>
	       <age>24</age>
	       <sex>female</sex>
	   </student>
	</students>
		
					
	
  • 外部dtd:将约束的规则定义在外部的dtd文件中
    • 本地:
    • 网络:
      代码如下:
<!ELEMENT students (student)+>
	        <!ELEMENT student (name,age,sex)>
	        <!ELEMENT name (#PCDATA)>
	        <!ELEMENT age (#PCDATA)>
	        <!ELEMENT sex (#PCDATA)>
	        <!ATTLIST student number ID #REQUIRED>


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

代码如下:

<?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"
	 
	 
	-->
	<a:students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	           xsi:schemaLocation="
	           http://www.itcast.cn/xml  student.xsd
	           http://cxf.apache.org/bindings/soap
	           "
	           xmlns:a="http://www.itcast.cn/xml"
	           xmlns:b="http://cxf.apache.org/bindings/soap"
	>
	   <a:student number="heima_0001">
	       <a:name>zhangsan</a:name>
	       <a:age>55</a:age>
	       <a:sex>male</a:sex>
	   </a:student>
	</a:students>
  1. 解析:操作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 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
     	
     Jsoup的主要功能	
     1)从一个URL,文件或字符串中解析HTML
     2)使用DOM或CSS选择器来查找、取出数据
     3)可操作HTML元素、属性、文本
     注意:jsoup是基于MIT协议发布的,可放心使用于商业项目。
     	* 快速入门:
     		* 步骤:
     			1. 导入jar包
     			2. 获取Document对象
     			3. 获取对应的标签Element对象
     			4. 获取数据
    
    • 代码:
package 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 Demo01_jsoup {
	   public static void main(String[] args) throws IOException {
	//        1.导包
	//        2.获取document对象,根据xml文档实现
	       //2.1获取student.xml的path
	       //xxx.class.getClassLoader().getResource(“”).getPath();
	       //获取src资源文件编译后的路径(即classes路径)
	       //xxx.class.getClassLoader().getResource(“文件”).getPath();
	       //获取classes路径下“文件”的路径
	       String path = Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
	       //2.2解析xml文档,加载文档进内存,获取dom树
	       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获取数据
	//        对于一个元素中的文本,可以使用Element.text()方法
	       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):通过网络路径获取指定的html或xml的文档对象
	代码如下:
	package xml解析;
	
	
	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 jsoup_jsoup对象 {
	   public static void main(String[] args) throws IOException {
	
	
	       //2.1获取student.xml的path
	       //xxx.class.getClassLoader().getResource(“”).getPath();
	       //获取src资源文件编译后的路径(即classes路径)
	       //xxx.class.getClassLoader().getResource(“文件”).getPath();
	       //获取classes路径下“文件”的路径
	
	
	       /*
	        * parse:解析html或xml文档,返回Document
	        *  parse(File in, String charsetName):解析xml或html文件的。
	        *  parse(String html):解析xml或html字符串
	        *   parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
	        *
	        *
	        * */
	       String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
	       //2.2解析xml文档,加载文档进内存,获取dom树
	       //第一种方法
	//        parse(File in, String charsetName):解析xml或html文件的。
	       Document document = Jsoup.parse(new File(path), "utf-8");
	       //System.out.println(document);
	       //第二种方法
	//        parse(String html):解析xml或html字符串
	       String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
	               "\n" +
	               "<students>\n" +
	               "\n" +
	               "    <student number=\"heima_0001\">\n" +
	               "        <name>zhangsan</name>\n" +
	               "        <age>55</age>\n" +
	               "        <sex>male</sex>\n" +
	               "    </student>\n" +
	               "    <student number=\"heima_0002\">\n" +
	               "        <name>lisi</name>\n" +
	               "        <age>55</age>\n" +
	               "        <sex>male</sex>\n" +
	               "    </student>\n" +
	               "\n" +
	               "</students>";
	       Document document1 = Jsoup.parse(str);
	       //System.out.println(document1);
	       //第三种方法
	//        parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
	//        int timeoutMillis 多少秒无响应则返回
	       URL url = new URL("https://www.baidu.com");
	       Document document2 = Jsoup.parse(url, 10000);
	       System.out.println(document2);
	
	
	   }
	}
	
			
			
  1. Document:文档对象。代表内存中的dom树
    • 获取Element对象
    • getElementById​(String id):根据id属性值获取

唯一的element对象
* getElementsByTag​(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute​(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合
代码如下:

package xml解析;
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 jsoup_document对象 {
public static void main(String[] args) throws IOException {
/*
* 2. Document:文档对象。代表内存中的dom树
* 获取Element对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
* */
String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource(“jsoup/student.xml”).getPath();
//2.2解析xml文档,加载文档进内存,获取dom树
// parse(File in, String charsetName):解析xml或html文件的。
Document document = Jsoup.parse(new File(path), “utf-8”);
// * getElementsByTag(String tagName):根据标签名称获取元素对象集合
Elements elementsByTag = document.getElementsByTag(“student”);
System.out.println(elementsByTag);
System.out.println("-------------");
// getElementsByAttribute(String key):根据属性名称获取元素对象集合
Elements name = document.getElementsByAttribute(“id”);
System.out.println(name);
System.out.println("--------------");
// getElementById(String id):根据id属性值获取唯一的element对象
Element elementById = document.getElementById(“001”);
System.out.println(elementById);
System.out.println("--------------");
// getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
Elements id = document.getElementsByAttributeValue(“id”, “001”);
System.out.println(id);

}
}

  1. Elements:元素Element对象的集合。可以当做 ArrayList来使用
    4. Element:元素对象
    1. 获取子元素对象
    * getElementById​(String id):根据id属性值获取唯一的element对象
    * getElementsByTag​(String tagName):根据标签名称获取元素对象集合
    * getElementsByAttribute​(String key):根据属性名称获取元素对象集合
    * getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合

    1. 获取属性值
      * String attr(String key):根据属性名称获取属性值
    2. 获取文本内容
      * String text():获取文本内容
      * String html():获取标签体的所有内容(包括字标签的字符串内容)
      代码如下:
	package xml解析;
	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 jsoup_element {
	   public static void main(String[] args) throws IOException {
	       /*
	       * 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():获取标签体的所有内容(包括字标签的字符串内容)
	       * */
	       String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
	       //2.2解析xml文档,加载文档进内存,获取dom树
	       // parse(File in, String charsetName):解析xml或html文件的。
	       Document document = Jsoup.parse(new File(path), "utf-8");
	       Elements name = document.getElementsByTag("name");
	       System.out.println(name.size());
	       System.out.println("-------");
	       Element ele_student = document.getElementsByTag("student").get(0);
	       Elements ele_name = ele_student.getElementsByTag("name");
	       System.out.println(ele_name.size());
	       System.out.println("-----------");
	
	
	       String number = ele_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);
	
	
	   }
	}

在这里插入图片描述

		5. Node:节点对象
			* 是Document和Element的父类
	* 快捷查询方式:
		1. selector:选择器
			* 使用的方法:Elements	select​(String cssQuery)
				* 语法:参考Selector类中定义的语法
		
			* 代码:
package 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 jsoup_selector快速查询 {
	   public static void main(String[] args) throws IOException {
	       /**
	        *1. selector:选择器
	        *           * 使用的方法:Elements   select(String cssQuery)
	        *              * 语法:参考Selector类中定义的语法
	        * */
	       String path = jsoup.Demo01_jsoup.class.getClassLoader().getResource("jsoup/student.xml").getPath();
	       //2.2解析xml文档,加载文档进内存,获取dom树
	       // parse(File in, String charsetName):解析xml或html文件的。
	       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为001的元素
	       Elements element1 = document.select("#001");
	       System.out.println(element1);
	       //5.获取student标签并且number属性值为heima_0001的aged的子标签
	       //5.1获取student标签并且number属性值为heima_0001
	       Elements number = document.select("student[number=\"heima_0001\"]");
	       System.out.println(number);
	       System.out.println("=============");
	       //5.2 获取student标签并且number属性值为heima_0001的aged的子标签
	       Elements age = document.select("student[number=\"heima_0001\"] >age");
	       System.out.println(age);
	   }
	}
	
	
	
  1. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
    * 使用Jsoup的Xpath需要额外导入jar包。
    * 查询w3cshool参考手册,使用xpath的语法完成查询
    代码如下:
         package 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;
	public class jsoup_Xpath {
	   public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
	//        XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
	//                * 使用Jsoup的Xpath需要额外导入jar包。
	//       * 查询w3cshool参考手册,使用xpath的语法完成查询
	       //1.获取student.xml的path
	       String path = jsoup_Xpath.class.getClassLoader().getResource("jsoup/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属性值为itcast
	       List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
	       for (JXNode jxNode : jxNodes4) {
	           System.out.println(jxNode);
	       }
	
	
	   }
	
	
ystem.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属性值为itcast
	       List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
	       for (JXNode jxNode : jxNodes4) {
	           System.out.println(jxNode);
	       }
	
	
	   }
	
	
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值