XML学习笔记

2020-05-04 16:02:56来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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文档中
		代码如下:
	

?```java
<?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来使用

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

	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);
	       }
	
	
	   }
	
	
	}


原文链接:https://www.cnblogs.com/M-28/p/Maxzhang.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:【面试题】Java类初始化和实例初始化的顺序

下一篇:常见算法总结 - 二叉树篇