JavaWeb–XML(数据处理的必经之路)
一篇文章读懂整个XML
本文系统全面的介绍了XML,在本文实现对整个XML的认识、理解并运用。将引领大家更好的对XML的学习
文章目录
XML的作用
XML是什么
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
XML(Extensible Markup Language)扩展性标识语言。文件的后缀名为:.xml。就像HTML的作用是显示数据,XML的作用是传输和存储数据。
XML与HTML的比较
XML的用途
为了便于不同应用、不同平台之间的数据共享和通信。
-
可作为一种简单的数据库,存储并检索数据;
-
传输约定格式的文件;
-
做软件的配置文件。【配置文件:保存软件设置的文件】
XML书写语法规则
- XML文档结构
- XML声明
XML标签书写规则
-
合法的标签名
-
适当的注释与缩进
-
合理使用属性
-
处理特殊字符
-
xml文件练习
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<hr>
<employee no="3309">
<name>张三</name>
<age>18</age>
<salary>3000</salary>
<department>
<dname>会计部</dname>
<address>重庆xx大厦-A1</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>22</age>
<salary>4000</salary>
<department>
<dname>工程部</dname>
<address>重庆xx大厦-B4</address>
</department>
</employee>
</hr>
将文件拖入浏览器(笔者使用浏览器为谷歌)中即可展示文件。
CDATA标签
- 有序的子元素
Java解析XML
Dom4j
下载地址:https://dom4j.github.io/
注意事项:Dom4j的版本对jdk的版本有限制要求,在下载的时候需要注意版本的控制。
运用实现对xml文件的读取
package JavaWeb.xml.dom4j;
import org.dom4j.Attribute;
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 = "F:/xxx/src/JavaWeb/xml/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"));
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) {
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
运用实现对xml文件的写入
package JavaWeb.xml.dom4j;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class HrWriter {
public void writerXml(){
String file = "F:/xxx/src/JavaWeb/xml/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("19");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("重庆xx大厦-c4");
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.writerXml();
}
}
写入之后,返回查看xml文件(此处为hr,xml)文件会增加HrWriter编写的内容
XML的语句约束
XML语句约束
DTD
- DTD文件练习
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
XML Schema
XSD是DTD替代者的原因
- 据将来的条件可扩展
- 比DTD丰富和有用
- 用XML书写
- 支持数据类型
- 支持命名空间。
XML Schema的优点:
- XML Schema基于XML,没有专门的语法
- XML Schema可以象其他XML文件一样解析和处理
- XML Schema比DTD提供了更丰富的数据类型.
- XML Schema提供可扩充的数据模型。
- XML Schema支持综合命名空间
- XML Schema支持属性组。
- 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" minOccurs="1" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="name" type="string"></element>
<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="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
Xpath的路径表达式
Jaxen
下载地址:http://www.java2s.com/Code/Jar/j/Downloadjaxen112jar.htm
package JavaWeb.xml.Xpath;
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 XpathTest {
public void xpath(String xpathExp){
String file = "F:/xxx/src/JavaWeb/xml/hr.xml"; //查询文件的位置
SAXReader reader = new SAXReader(); //SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中。
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) {
XpathTest test = new XpathTest();
// test.xpath("/hr/employee"); //查询hr节点下的employee
// test.xpath("//employee"); //查询任意节点的employee
// test.xpath("//employee[salary<3600]");//查询满足条件salary小于3600的employee
// test.xpath("//employee[name='李铁柱']"); //查询满足条件name为李铁柱的employee
// test.xpath("//employee[@no=3309]");//查询满足条件no为3309的employee
// test.xpath("//employee[1]");//查询第一位employee
// test.xpath("//employee[last()]");//查询最后一位employee
// test.xpath("//employee[position()<3]");//查询前三位emp
test.xpath("//employee[3] | //employee[2]");//查询第三位和第二位employee
}
}