XML入门笔记

XML是什么?
XML的全称是EXtendsiable Markup Language,可扩展标记语言
编写XML就是编写标签,与HTML非常类似。拓展名为 .xml
具有良好的人机可读性
请看下面的xml的例子:

  <employee>
	<name>张三</name>
	<age>31</age>
	<height>178</height>
 </employee>

XML与HTML的比较

XML与HTML非常相似,都是编写标签

XML没有预定义标签,HTML存在大量的预定义标签

XML重在保存与传输数据,HTML用于显示信息

XML有什么用途?
1、java程序的配置描述文件。
2、用于保存程序所产生的数据。
3、网络间的数据传输。

XML的文档结构

第一行必须是XML声明
有且只有一个根节点
XML标签的书写规则与HTML相同

XML声明:
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。

XML标签的书写规则

1、合法的标签名
标签名称要有意义
建议使用英文,小写字母,单词之间使用"-“分隔.
建议多级标签之间不要存重名的情况。
2、适当的缩进及其注释
3、合理使用属性
标签属性用于描述标签不可或缺的信息
对标签分组或者为标签设置id时常用属性表示。
4、特殊字符与CDATA标签
处理特殊字符:标签中,出现”<" ">"特殊字符,会破坏文档结构
解决方案1:使用实体标签引用。
XML支持五种实体引用

实体引用对应符号说明
&lt;<小于
&gt;>大于
&amp;&和号
&apos;单引号
&quot;"双引号
	<exam>
	      <question> 1+5 &lt;3是否正确?</question>
	</exam>

解决方案2:使用CDATA标签。
1 CDATA指的是不应由XML解析器进行解析的文本数据。
2 从"<![CDATA["开始,到"]]>"结束

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


XML的语义约束
XML文档结构正确,但可能不是有效的。
例如:员工档案XML中绝不允许出现“植物品种”标签。XML语义约束就适用于规定XML文档中允许出现那些元素。

XML语义约束有两种定义方式:DTD和XML Schema.

Document Type Definition

DTD是一种简单易用的语义约束方式。
DTD文件的扩展名为.dtd 。
利用DTD种的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以hr.xml为例:

<!ELEMENT hr(employee)> 定义hr节点下只允许出现的1个employee子节点。 <!ELEMENT employee(name,age,salary,department)> employee节点下必须包含以下四个节点,且按顺序出现。 <!ELEMENT name(#PCDATA)>定义name标签只能是文本,#PCDATA代表文本元素。
DTD定义节点数量
如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
<!ELEMENT  hr  (employee+)> hr节点下最少出现1个employee子节点。
<!ELEMENT  hr  (employee*)> hr节点下可出现0...n个employee子节点。
 <!ELEMENT  hr   (employee?)> hr节点下最多可出现1个employee子节点。(hr (...)之间必须存在一个空格)	

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

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

使用ATTLIST标签来指定标签有那些属性。
例如:<!ATTLIST employee no CDATA "" >

	DOM文档对象模型

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

如何在java程序种获取xml元素?使用dom4j 去百度搜素dom4j进入官网下载,然后将dom4j复制到文件夹XML中

在java程序方法体中使用:
String url = “这是xml存储的路径”
SAXReader reader = new SAXReader();
Document doct = reader.read(url); //此处需要处理异常。

Element  root  =  doct.getRootElement("xml的首标签");  //获得xml文件的根目录
List<Document>   elem  =  root.element("属性名/标签名");  //获取标签的document对象数组;

for( Element temp:elem ){
          String   =  temp.elementText("子一级标签名");
          //或者是如下的方法
          Element   s  =  temp.element("子一级标签名");
          s.getText();  //该方法返回标签里的文本。
}

		如何更新XML中的文件呢?
String url = "这是xml存储的路径"
SAXReader  reader = new SAXReader();
Document document = reader.read(file);
//获取根节点
Element  root  = document.getRootElement();
//找到需要添加内容节点的根节点
Element nodeName = root.Element("节点名");
//为该节点添加属性
nodeName.addAttribute("属性名", "属性值");
//为该节点添加新的子节点
Element subNodeA  =  nodeName.addElement("新节点名称");
//为节点设置文本内容
subNodeA.setText("为该节点设置的文本内容");
//新增其它节点和为节点设置值的操作与上面 相一致。
//。。。。。

//将新增的内容写入到xml文件当中。
Writer  wtr  = new OutputStream( new FileOutputStream(file),"UTF-8");  //utf-8不能少,否则中文会出现乱码
//创建一个Writer对象,将文件重新写入到xml文件当中。此处需要处理异常

document.writer(wtr);  //将Writer对象当作参数传入。
wtr.close();	//关闭文件句柄。

		XPath表达式  【分为基本表达式和谓语表达式】

XPath路径表达式是XML文档中查找数据的语言
掌握XPath可以极大的提高在提取数据时的开发效率。
学习Xpath本质就是掌握各种形式表达式的使用技巧

		XPath基本表达式

表达式		描述

nodename	选取此节点的所有节点
/		从根节点选取
//		从匹配选择的当前接待你选择文档中的节点,而不考虑它们的位置
.		选取当前节点
..		选取当前接待你的父节点
@		选取属性。	
	


		XPath基本表达式案例

路径表达式			结果
bookstore		选取bookstore元素所有子节点
/bookstroe		选取根元素bookstore
bookstore/book		选取属于bookstore子元素的所有book元素
//book			选取说有book子元素,而不管他们在文档中的位置
bookstore//book	               选取属于bookstore元素的后代所有book元素,而不管他们位于bookstore之下的什么位置
//@lang			选取名为lang的所有属性

		XPath谓语表达式

路径表达式		结果
/bookstore/book[1]    选取属于bookstore子元素的第一个book元素。

/bookstore/book[lase()]	选取属于bookstore子元素的最后一个book元素
/bookstore/book[lase()-1]	选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[postion()<3]  选取前面两个属于bookstore子元素的book元素
//title[@lang]		选取所有拥有名为lang的属性的title元素。
//title[@lang="eng"]	选取所有title元素,而且满足这元素的值为eng的lang属性
/bookstore/book[price>35]	选取bookstore元素的所有book元素,且其中的price元素值必须大于35.00
/bookstore/book[price>35]/title	选取bookstore元素中的book元素的所有title元素,其中price元素值必须大于35.00

/************************************************************************************************************/

		利用XPath表达式

调用对象的.selectNodes("XPath表达式");该方法返回一个List<Element>的列表,只需对其进行遍历即可。
	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[last()]");
// testor.xpath("//employee[position()<6]");
// testor.xpath("//employee[3] | //employee[8]");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值