长文预警,可以收藏慢慢看,本文适合零基础学习,你们的三连是羽毛最大的动力
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version="1.0" encoding="UTF-8"?>
//version 代表版本号1.0 encoding UTF-8 设置字符集,用于支持中文
在XML中所有的标签和属性都是可以进行自定义的,所以我们写的时候尽量让它与内容相匹配,增强可读性
例如:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 (这是注释) -->
<hr> <!-- 根节点 -->
<employee no="857857">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-A103</address>
</department>
</employee>
</hr>
如何使用IDEA创建xml文件:使用IDEA创建xml文件
目前大多数的浏览器对于xml提供了良好的校验和检查
如何使用浏览器对xml进行结构检查
XML标签书写规则请移步此篇文章:XML标签书写规则
DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式.
DTD文件的扩展名为.dtd
<!ELEMENT hr (employee)>
<!ELEMENT employee (name,age,salary,department)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT hr (employee+)>
<!ELEMENT hr (employee*)>
<!ELEMENT hr (employee?)>
现在有一个.xml文件,要创建.dtd文件并且添加约束
<hr>
<employee no="1111">
<name>张三name>
<age>18age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦address>
department>
employee>
hr>
创建一个.dtd文件(IDEA如何创建.dtd文件可以参考 IDEA如何创建.dtd文件)
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT employee.department (dname,address)>
<!ELEMENT department (#PCDATA)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="hr">
<xs:complexType>
<xs:sequence>
<xs:element name="employee" minOccurs="1" maxOccurs="999">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string">xs:element>
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18">xs:minInclusive>
<xs:maxInclusive value="60">xs:maxInclusive>
xs:restriction>
xs:simpleType>
xs:element>
<xs:element name="salary" type="xs:integer">xs:element>
<xs:element name="department">
<xs:complexType>
<xs:sequence>
<xs:element name="dname" type="xs:string">xs:element>
<xs:element name="address" type="xs:string">xs:element>
xs:sequence>
xs:complexType>
xs:element>
xs:sequence>
<xs:attribute name="no" type="xs:string" use="required">xs:attribute>
xs:complexType>
xs:element>
xs:sequence>
xs:complexType>
xs:element>
xs:schema>
示例所用xml代码:
<hr xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="1111">
<name>张三name>
<age>19age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦address>
department>
employee>
hr>
Dom4j官网下载链接 404
这个链接不好使了,大家可以关注公众号:羽毛的技术栈 回复dom4j 免费获取dom4j的jar包
使用IDEA如何导入jar包
例子所遍历的XML文件内容为
<hr>
<employee no="1111">
<name>张三name>
<age>18age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦address>
department>
employee>
hr>
通过dom4j遍历XML需要创建一个.java文件:
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.xml.parsers.SAXParser;
import java.util.List;
public class HrReader {
public void readXml(){
//写入要读取的文件所在路径
String file = "E:/JavaWeb/xml/src/hr.xml";
//SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
SAXReader reader = new SAXReader();
try{
//之前说过Dom4j将XML视为Document对象
Document document = reader.read(file);
//获取XML文档的根节点
Element root = document.getRootElement();
//element方法用于获取指定的标签集合
List<Element> employees = (List<Element>) root.elements("employee");
for(Element employee : employees){
//用Attribute 遍历属性
Attribute attribute = employee.attribute("no");
System.out.println(attribute.getText());
//直接通过 elementText() 方法来读出文本的值
System.out.println(employee.elementText("name"));
System.out.println(employee.elementText("age"));
System.out.println(employee.elementText("salary"));
//出现分支,获取节点
Element department = employee.element("department");
System.out.println(department.elementText("dname"));
System.out.println(department.elementText("address"));
}
}catch (DocumentException e){
e.printStackTrace();
}
}
public static void main(String[] args){
HrReader hrReader = new HrReader();
hrReader.readXml();
}
}
import org.dom4j.Document;
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 writerXml(){
//获取将要更新的xml的文件路径
String file = "E:/JavaWeb/xml/src/hr.xml";
//SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
SAXReader reader = new SAXReader();
try{
Document document = reader.read(file);
//获取根节点
Element root = document.getRootElement();
//获取节点
Element employee = root.addElement("employee");
//addAttribute()是添加属性
employee.addAttribute("no","3311");
//addElement()是添加文本
employee.addElement("name").setText("李铁柱");
employee.addElement("age").setText("25");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("XX大厦-B105");
//以上代码实现了在内存中生成的步骤,下面要来将内存中的东西写到xml文件中
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();
}
}
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素的所有子节点 |
/bookstore | 选取根元素bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
bookstore//book | 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置。 |
//@lang | 选取名为lang的所有属性 |
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素。 |
/bookstore/book[last()] | 选取属于 bookstore子元素的最后一个book元素。 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素。 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 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 |
在使用XPath之前,需要做一些前置的准备工作,下载Jaxen并导入jar包
使用IDEA而不会导入JAR包的看这里:使用IDEA如何导入jar包
这是需要查询的XML文件
<hr>
<employee no="3301">
<name>张三name>
<age>18age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3302">
<name>李铁柱name>
<age>25age>
<salary>3600salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
<employee no="3303">
<name>李二狗name>
<age>19age>
<salary>4500salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3304">
<name>张顺溜name>
<age>29age>
<salary>4800salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
<employee no="3305">
<name>李四name>
<age>25age>
<salary>5000salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3306">
<name>王五name>
<age>27age>
<salary>6600salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
hr>
创建一个XPathTestor类
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 = "E:/JavaWeb/xml/src/hr.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 xPathTestor = new XPathTestor();
xPathTestor.xpath("/hr/employee");
}
}
运行结果
这样就能使用XPath了,大家可以一一尝试Xpath的效果
XML(从是什么到怎么用) 此文到此结束,若觉得写得还不错,点赞收藏顺便关注一下羽毛,下一篇将介绍Servlet
若有错误,请各位大佬指正
人与人之间最好的关系就是互相成就,你们的三连就是我最大的动力