浅谈XML

目录

 一、简介:

二、XML和HTML比较:

三、XML的用途:

四、XML的文档结构:

法B:使用CDATA标签:

五、XML语义约束:

1.DTD约束(Document Type Definition):

2.XML Schema约束:

六、DOM文档对象模型:

1.简介:

 2.Dom4j:

 七、XPath路径表达式:

八、 Jaxen:


 一、简介:

  • XML全称:EXtensible Markup Language(可扩展标记语言)。
  • 编写XML就是编写标签,与HTML非常相似。
  • 扩展名是:.xml
  • 具有良好的人机可读性

二、XML和HTML比较:

  • XML与HTML非常相似,都是编写标签。
  • XML没有预定义标签,而HTML存在大量预定义标签。
  • XML重在保存和传输数据,HTML用于显示信息。

三、XML的用途:

  • 是Java的配置描述文件。
  • 用于保存程序产生的数据。
  • 用于网络间的数据传输。

四、XML的文档结构:

1.第一行必须是XML声明:XML声明用于说明XML文档的基本信息,包括版本号和字符集。

如:

<?xml version="1.0" encoding="UTF-8"?>

version代表版本号(1.0或1.1),encoding="UTF-8"设置字符集,用于支持中文

2.有且只有1个根节点

3.XML标签的书写规则和HTML相同:

①合法的标签名:

  • 标签名要有意义
  • 建议使用英文,小写字母,单词间用"-"分割。
  • 建议使用多级标签时不要存在重名情况。

②适当的注释与缩进。

③合理使用属性:

  • 标签属性用于描述标签不可或缺的情况。
  • 对标签分组或为标签设置id时常用属性表示。

④处理特殊字符:

  • 标签体中出现"<",">"特殊字符会破坏文档结构(误认为是标签的开始或结束符)。
  • 解决:

法A:使用实体引用:直接替换

XML的5种实体引用
实体引用对应符号说明
&lt;<小于
&gt;>大于
&amp;&
&apos;'单引号
&quot"双引号

法B:使用CDATA标签

  • CDATA指不应该由XML解析器来解析的文本数据。
  • 从"<![CDATA["开始,到"]]>"结束,被括住的内容不会被解析,而是原样输出。

例:

<?xml version="1.0" encoding="UTF-8"?>
<lesson>
  <content>
      今天学习HTML的a标签
  <body>
    <a href="b.index">返回</a>
  </body>
  </content>
</lesson>

使用CDATA标签后:

<?xml version="1.0" encoding="UTF-8"?>
<lesson>
  <content>
  <![CDATA[
      今天学习HTML的a标签
  <body>
    <a href="b.index">返回</a>
  </body>
  ]]>
  </content>
</lesson>

⑤有序的子元素:在XML多层嵌套的子元素中,标签前后顺序应保持一致。

4.XML中所有标签和属性都可以自定义。

例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr>
  <employee id="001">
    <name>张三</name>
    <age>25</age>
    <salary>4000</salary>
    <department>
      <dname>客服部</dname>
      <address>xx写字楼—A807</address>
    </department>
  </employee>
    <employee id="002">
    <name>李四</name>
    <age>31</age>
    <salary>4000</salary>
    <department>
      <dname>销售部</dname>
      <address>xx写字楼—A807</address>
    </department>
  </employee>
</hr>

可以把XML文件拖进浏览器里进行校验,以火狐为例显示如下:

五、XML语义约束:

  • XML文档结构正确,但可能不是有效的。(  如员工档案中绝不允许出现“植物品种”标签。)
  • XML语义约束就是用于规定XML文档中允许出现哪些元素。
  • XML语义约束有2种定义方式:DTD和XML Schema。

1.DTD约束(Document Type Definition):

  • DTD是一种简单易用的语义约束方式。
  • DTD文件的扩展名是:.dtd   。
  • 使用<!ELEMENT>标签可以定义XML文档中允许出现的节点和数量。

如:

<!ELEMENTS hr (employee)>  <!--定义hr节点下只允许出现1个employee子节点-->
<!ELEMENT employee (name,age,salary,department)>  <!--定义emplyee节点下必须包含以下4个节点,且按顺序出现-->
<!ELEMENT name (#PCDATA)>  <!--定义name标签体只能是文本,#PCDATA表示文本元素-->
  • 若某子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
<!ELEMENT hr (employee+)>  <!--hr节点下最少出现1个employee子节点-->
<!ELEMENT hr (employee*)>  <!--hr节点下可出现0———n个employee子节点-->
<!ELEMENT hr (employee?)>  <!--hr节点下最多出现1个employee子节点-->
  • 在XML中用<!DOCTYPE>标签来引用DTD文件。

书写格式:<!DOCTYPE 根节点 SYSTEM "dtd文件路径">

示例:<!DOCTYPE hr SYSTEM "hr.dtd">

  • 使用<ATTLIST>标签说明在节点中有哪些属性。

例:

hr.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">  <!-- 引用DTD -->
<!-- 人力资源管理系统 -->
<hr>
	<employee id="001">
		<name>张三</name>
		<age>25</age>
		<salary>4000</salary>
		<department>
			<dname>客服部</dname>
			<address>xx写字楼—A807</address>
		</department>
	</employee>
	<employee id="002">
		<name>李四</name>
		<age>31</age>
		<salary>4000</salary>
		<department>
			<dname>销售部</dname>
			<address>xx写字楼—A807</address>
		</department>
	</employee>
</hr>

 hr.dtd:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee id CDATA ""> <!-- <!ATTLIST 标签名称 属性名称  节点类型  默认值> -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)> 
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>

注意编写DTD文件时,父节点后面一定要有空格,不能紧跟括号,否则DTD文件不会生效。

2.XML Schema约束:

  • XML Schema比DTD更复杂更严谨,功能更强大。
  • XML Schema提供了数据类型、格式限定、数据范围等特性。
  • XML Schema是W3C标准。
  • XML Schema文件的扩展名是:.xsd   。

例:

hr-schema.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="hr.xsd">  <!-- 引用XML Sechema文件 -->
	<employee id="001">
		<name>张三</name>
		<age>25</age>
		<salary>4000</salary>
		<department>
			<dname>客服部</dname>
			<address>xx写字楼—A807</address>
		</department>
	</employee>
	<employee id="002">
		<name>李四</name>
		<age>31</age>
		<salary>4000</salary>
		<department>
			<dname>销售部</dname>
			<address>xx写字楼—A807</address>
		</department>
	</employee>
</hr>

hr.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
	<element name="hr">
		<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
		<complexType>
			<sequence>
				<!--sequence标签表示其内的内容是顺序的 -->
				<element name="employee" minOccurs="1" maxOccurs="100">  <!-- 表示该节点最少出现1次,最多出现100次。非常灵活,根据需要自由设置 -->
					<complexType>
						<sequence>
							<element name="name" type="string"></element>  <!--string表示name的输入只能是字符串,不能有子节点 -->
							<element name="age">  <!-- 只能是整型 -->
							  <simpleType>  <!-- 表示简单类型(可进行详细数据范围设置) -->
									<restriction base="integer">  <!-- 进行整数方面的限制 -->
										<minInclusive value="18"></minInclusive>  <!-- 最小 -->
										<maxInclusive value="60"></maxInclusive>  <!-- 最大 -->
									</restriction>
								</simpleType>
							</element>
							<element name="salary" type="integer"></element>
							<element name="department">
								<complexType>
									<sequence>
										<element name="dname" type="string"></element>
										<element name="address" type="string"></element>
									</sequence>
								</complexType>
							</element>
						</sequence>
						<attribute name="id" type="string" use="required"></attribute> <!-- 表示id属性在任何employee标签下必须存在 -->
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>

六、DOM文档对象模型:

1.简介:

  • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。

例:

<?xml version="1.0" encoding="UTF-8"?>
<cart>
  <item sn="711">
    <name>空调</name>
    <price>2000.0</price>
  </item>  
  <item sn="890">
    <name>面包</name>
    <price>10.0</price>
  </item> 
</cart>

 2.Dom4j:

  • Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大、极易使用的特点。
  • Dom4j将XML视为Document对象。
  • XML标签被Dom4j定义为Element对象(即元素)。

下载直接搜Dom4j(结构第一个就是),或者直接点https://dom4j.github.io/

例:
hr.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"><!-- 人力资源管理系统 -->
<hr>
	<employee no="3301">
		<name>李铁柱</name>
		<age>37</age>
		<salary>3600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B105</address>
		</department>
	</employee>
	<employee no="3302">
		<name>林海</name>
		<age>50</age>
		<salary>7000</salary>
		<department>
			<dname>财务部</dname>
			<address>XX大厦-B106</address>
		</department>
	</employee>
</hr>

HrReader.java: 对xml文件进行读操作

package com.imooc.dom4j;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HrReader {
	public void readXml(){
		String file = "D:/java web/xml/src/hr.xml";
		//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中。
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			//获取XML文档的根节点,即hr标签
			Element root = document.getRootElement();
			//elements方法用于获取指定的标签集合
			List<Element> employees =  root.elements("employee");
			for(Element employee : employees){
				//element方法用于获取唯一的子节点对象
				Element name = employee.element("name");
				String empName = name.getText();//getText()方法用于获取标签文本
				System.out.println(empName);
				
				System.out.println(employee.elementText("age"));  //一句相当于上面的3句,简单版
				System.out.println(employee.elementText("salary"));
				Element department = employee.element("department");
				System.out.println(department.element("dname").getText());
				System.out.println(department.element("address").getText());
				Attribute att = employee.attribute("no");  //获得属性值
				System.out.println(att.getText());
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		HrReader reader = new HrReader();
		reader.readXml();
	}
	
}

HrWriter.java:对xml文件进行写操作

package com.imooc.dom4j;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HrWriter {
	public void writeXml() {
		String file = "D:/java web/xml/src/hr.xml";
		SAXReader reader = new SAXReader();

		try {
			Document document = reader.read(file);
			Element root = document.getRootElement();
			Element employee = root.addElement("employee");
			employee.addAttribute("no", "3311"); // 创建属性
			Element name = employee.addElement("name");
			name.setText("李铁柱"); // 设置文本内容
			employee.addElement("age").setText("37");
			employee.addElement("salary").setText("3600");
			Element department = employee.addElement("department");
			department.addElement("dname").setText("人事部");
			department.addElement("address").setText("XX大厦-B105");
			Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
			document.write(writer); // 将DOM模型写入对应文件
			writer.close(); // 关闭流
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		HrWriter hrWriter = new HrWriter();
		hrWriter.writeXml();
	}
}

 xml文件末尾出现要更新的内容:

 注意要导入Jaxen的jar包。

 七、XPath路径表达式:

  • XPath路径表达式是XML文档中查找数据的语言。
  • 掌握XPath可大大提高数据时的开发效率。
  • 学习XPath本质就是掌握各种形式表达式的使用技巧。
    XPath常用的基本表达式
    表达式描述
    nodename选取此节点的所有子节点
    /从根节点选取
    //从匹配选择的当前节点中选择文档的节点,而不考虑它们的位置
    .选取当前节点
    ..选取当前节点的父节点
    @选取属性

    举例:

表达式描述
bookstore选取此节点的所有子节点
/bookstore

选取根元素bookstore

(注意:若路径起始于正斜杠/,则此路径始终代表到某元素的绝对路径)

bookstore/book选取属于bookstore的子元素的所有book元素
//book选取所有book子元素,而不管它们在文档在中的位置
bookstore//book选取属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置
//@lang选取名为lang的所有属性

 

XPath谓语表达式举例
表达式描述
/ bookstore /book [1]选取属于bookstore子元素的第一个book元素
/ bookstore /book [ last () ]选取属于bookstore子元素的最后一个book元素
/ bookstore / book [ last () -1 ]选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[position()<3]选取最前面的2个属于bookstore元素的子元素的book元素
//title[@lang]选取所有名为 lang 的属性的 title 元素
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的price 元素的值须大于35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的price 元素的值须大于35.00。

例:
hr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
	<employee no="3301">
		<name>李铁柱</name>
		<age>37</age>
		<salary>3600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B105</address>
		</department>
	</employee>
	<employee no="3302">
		<name>林海</name>
		<age>50</age>
		<salary>7000</salary>
		<department>
			<dname>财务部</dname>
			<address>XX大厦-B106</address>
		</department>
	</employee>
	<employee no="3303">
		<name>安娜</name>
		<age>24</age>
		<salary>4600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B105</address>
		</department>
	</employee>
	<employee no="3304">
		<name>张晓宇</name>
		<age>29</age>
		<salary>3000</salary>
		<department>
			<dname>后勤部</dname>
			<address>XX大厦-B108</address>
		</department>
	</employee>

	<employee no="3305">
		<name>赵子轩</name>
		<age>19</age>
		<salary>1500</salary>
		<department>
			<dname>后勤部</dname>
			<address>XX大厦-B108</address>
		</department>
	</employee>

	<employee no="3306">
		<name>张晓璇</name>
		<age>20</age>
		<salary>1700</salary>
		<department>
			<dname>后勤部</dname>
			<address>XX大厦-B108</address>
		</department>
	</employee>
	<employee no="3307">
		<name>张檬</name>
		<age>43</age>
		<salary>8700</salary>
		<department>
			<dname>会计部</dname>
			<address>XX大厦-B103</address>
		</department>
	</employee>
	<employee no="3308">
		<name>李梅</name>
		<age>33</age>
		<salary>8700</salary>
		<department>
			<dname>工程部</dname>
			<address>XX大厦-B104</address>
		</department>
	</employee>
</hr>

XPathTestor.java

package com.imooc.dom4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPathTestor {
	public void xpath(String xpathExp) {
		String file = "D:/java web/xml/src/hr.xml";
		SAXReader reader = new SAXReader(); // 读取文件
		try {
			Document document = reader.read(file);

			List<Node> nodes = document.selectNodes(xpathExp); // 执行XPath表达式,Node是节点Element和属性Attribute的父类
			for (Node node : nodes) {
				Element emp = (Element) node;
				System.out.println(emp.attributeValue("no")); // attributeValue()直接获取属性值
				System.out.println(emp.elementText("name"));
				System.out.println(emp.elementText("age"));
				System.out.println(emp.elementText("salary"));
				System.out.println("==============================");
			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		XPathTestor testor = new XPathTestor();
//		testor.xpath("/hr/employee");
//		testor.xpath("//employee");
//		testor.xpath("//employee[salary<4000]");
//		testor.xpath("//employee[name='李铁柱']");  //注意文本用单引号
//		testor.xpath("//employee[@no=3304]");
//		testor.xpath("//employee[1]");  //第一个出现的employee节点
//		testor.xpath("//employee[last()]");  //后去最后一个employee节点
		// testor.xpath("//employee[position()<3]"); //position()表示当前位置
		testor.xpath("//employee[3] | //employee[8]"); // 组合表达式:获取第3个和第8个
	}
}

 

八、 Jaxen:

  • Jaxen是一个Java编写的开源的XPath库。使适应多种不同的对象模型(包括DOM、XOM、dom4j和JDOM)。
  • dom4j底层依赖Jaxen以实现XPath查询。
  • Jaxen下载地址:

可在阿里云仓库下载,先打开 maven.aliyun.com,然后搜索(如下图):

 选择中央仓库的下载。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值