XML
五个方面
- XML介绍与用途
- XML的语法规则
- XML语义约束
- Java解析XML
- XPath路径表达式
XML介绍与用途
介绍
全称:EXtensible Markup Language
可扩展 标记 语言
编写XML就是编写标签,与HTML非常类似,扩展名.xml
良好的人机可读性
`<employee> <name>张三</name> <age>20</age> <height>1.80</height> </employee>
用途
- Java程序的配置描述文件(web.xml—web应用配置文件)
- 用于保存程序产生的数据
- 网络间的数据传输(webservice底层soap协议:)
语法规则(文档结构)
- 第一行必须是XML声明
- 有且只有一个根节点
- XML标 签的书写规则与HTML相同
XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0" encoding="UTF-8"?>
version 代表版本号1.0 encoding UTF-8设置字符集,用于支持中文
XML标签书写规则
合法的标签名
- 标签名要有意义
- 建议使用英文,小写字母,单词之间使用 “ - “分割。
- 建议多级标签之间不要存在重名情况
适当的注释与缩进
适当的注释与缩进可以让XML文档更容易阅读
合理使用属性
- 标签属性用于描述标签不可或缺的信息
- 对标签分组或者为标签设置Id时常用属性表示
处理特殊字符
标签体中,出现”<”、”>”特殊字符,会破坏文档结构。
解决方案1:使用实体引用。
XML支持五种实体引用
实体引用 对应符号 说明 &It; < 小于 >; > 大于 &; & 和号 &apos; ‘ 单引号 "; “ 双引号 解决方案2:使用CDATA标签
- CDATA指的是不应由XML解析器进行解析的文本数据
- “”
有序的子元素
- 在XML多层嵌套的子元素中,标签前后顺序应保持一致
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<teaching-plan>
<course>
<course-name>大学英语</course-name>
<class-hour>36</class-hour>
<exam-form>考试</exam-form>
</course>
<course>
<course-name>高等数学</course-name>
<class-hour>70</class-hour>
<exam-form>考试</exam-form>
</course>
<course>
<course-name>计算机应用基础</course-name>
<class-hour>108</class-hour>
<exam-form>上机考试</exam-form>
</course>
</teaching-plan>
XML语义约束
- XML文档结构正确,但可能不有效。(如员工档案XML中出现“植物品种”)
- XML予以约束有两种定义方式:DTD与XML Schema
DTD
DTD Document Type Definition 文档类型定义
- DTD扩展名.dta
- 利用DTD中的<!ELEMENT>标签,定义XML文档中允许出现的节点和数量,举例如下:
<!--定义hr节点下只允许出现一个employee子节点--> <!ELEMENT hr (employee)> <!--必须含有以下下四个节点,且按顺序出现--> <!ELEMENT employee (name,age,salary,department)> <!--定义name标签体只能是文本,#PCDATA代表文本元素> <!ELEMENT name (#PCDATA)> <!--最少出现1个--> <!ELEMENT hr (employee+)> <!--最多出现1个> <!ELEMENT hr (employee?)> <!--可出现0~n个--> <!ELEMENT hr (employee*)>
XML怎么引用DTD文件?
回答:
格式:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
示例:
<!DOCTYPE hr SYSTEM "hr.dtd">
DTD的创建和使用
创建(idea):1.Tools
2.XML Actions
3.generate DTD from XML Files
注意:父节点之后一定要有空格
XML Schema
- XML Schema更复杂提供了更多功能
- XML Schema提供了数据类型、格式限定、数据范围等特性。
- XML Schema是W3C标准。(所以之后通常用XML Schema)
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<complexType>
<sequence>
<element name="employee">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="integer">
<restriction base="integer">
<minInclusive value="18"><minInclusive>
<maxInclusive value="60"><maxInclusive>
</restriction>
</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>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
Tips:框架和架构都离不开schema
java解析XML
DOM文档对象模型
- DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。
Dom4j
- Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点 。
- Dom4j将XML视为Document对象
- XML标签被Dom4j定义为Element对象
Dom4j遍历XML
package com.imooc.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class HrReader{
public void readXml(){
String file ="文件的路径";
//SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式
SAXReader reader=new SAXReader();
try{
Document document=reader.read(file);
//获取XML的根节点
Element root=document.getRootElement();
//elements方法用于获取指定的标签集合
List<Element> employees=root.elements("标签名(子节点名)");
for(Element employee:employ){
System.out.println(employee.elementText("name"));//获取name节点的文本内容
Attribute att=employee.attribute("属性名");
System.out.println(att.getText());
}
}
catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader=new HrReader();
reader.readXml();
}
}
利用Dom4j更新XML
package com.imooc.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class HrWriter {
public void writeXml(){
String file="C:\\Users\\Lenovo\\Desktop\\xml\\src\\haha.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("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);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrWriter hrWriter=new HrWriter();
hrWriter.writeXml();
}
}
XPath实验室
- 利用Dom4j开发”XPath实验室”,一起见证XPath的神奇之处
Jaxen介绍
- Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM。
- Dom4j底层依赖Jaxen实现XPath查询
- 下载地址:jaxen.codehaus.org
package com.imooc.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class XPathTestor {
public void xpath(String xpathExp){
String file="C:\\Users\\Lenovo\\Desktop\\xml\\src\\haha.xml";
SAXReader reader=new SAXReader();
try {
Document document=reader.read(file);
List<Node> nodes=document.selectNodes(xpathExp);
for(Node node:nodes){
Element emp=(Element) node;
System.out.println(emp.attributeValue("no"));
System.out.println(emp.elementText("name"));
System.out.println(emp.elementText("age"));
System.out.println(emp.elementText("salary"));
System.out.println("=============================");
}
} catch (DocumentException e) {
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]");
testor.xpath("//employee[last()]");
testor.xpath("employee[postion()<6]");
testor.xpath("//employee[3]|//employee[8]");
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!