版权声明:. https://blog.csdn.net/WildestDeram/article/details/86773060
XML入门
- XML的介绍和用途
- XML的文档结构
- JAVA解析XML
- XPath路径表达式
XML的介绍和用途
XML全称为EXtensible Markup Language,可扩展标记语言
编写XML就是编写标签,和HTML类型,扩展名.xml
优点:良好的人机可读性
<employee>
<name>Jack</name>
<age>28</age>
<height>178</height>
</employee>
XML与HTML的比较
- XML与HTML都是编写标签
- XML没有预定义标签,而HTML有
- XML重在保存和传输数据,而HMTL重在显示
XML用途
- 1.Java程序的配置文件:在实际开发中,不可能把程序的一些配置参数写进程序中,不然后期维护要从程序中修改。如果写进XML中,则可以大大提升维护性。
- 2.用于保存程序产生的数据
- 3.网络间的数据传输
XML的文档结构
XML文档结构(必备要素)
- 第一行必须是XML声明
- 只有一个根节点
- 标签抒写规则和HTML相同
XML声明是说明XML文档的基本信息,版本号与字符集
<?xml version="1.0" encoding="UTF-8"?>
<!--
version:版本号 1.0/1.1
encoding:设置字符集
只有设置为UTF-8才支持中文
-->
Java解析XML
解析文件hr.xml,参考上文
利用dom4j来遍历XML,dom4j能把XML内容解析成"树"状形式保存在内存中
HrReader.java
package com.dom4j.javaee;
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;
/**
* 读取XML的实现类
* @author Jun
*
*/
public class HrReader {
//读取XML的方法
public void readXML() {
// 获得XML的地址
String file = "C:\\Users\\Jun\\Desktop\\JavaWeb\\xml pro\\xml\\src\\hr.xml";
// SAXReader类是读取XML的核心类,用于将XML解析hou以"树"状的形式保存在内存中
SAXReader reader = new SAXReader();
// 用read()把XML解析成一个Document对象,try catch
try {
Document document = reader.read(file);
// getRootElement()获取XML的根节点,即hr,返回对象Element
//XML中所有的标签都是通过Element对象包装
Element root = document.getRootElement();
List<Element> employee = root.elements("employee"); // elements方法用于返回指定的标签集合x
for(Element e : employee) {
Element name = e.element("name"); //用于获取唯一的子节点
String empName = name.getText(); //获得标签内容
System.out.println(empName);
System.out.println(e.elementText("age")); //获取子节点内容
System.out.println(e.elementText("salary"));
Element department = e.element("department");
System.out.println(department.elementText("dname"));
System.out.println(department.elementText("address"));
Attribute att = e.attribute("no"); //获取属性
System.out.println(att.getText());
System.out.println();
}
} catch (DocumentException e) { //如果XML有语法异常,就会抛出异常
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
HrReader hr = new HrReader();
hr.readXML();
}
}
利用Dom4j来更新XML
package com.dom4j.javaee;
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 HrWrite {
public void writeXml() {
// 获得XML的地址
String file = "C:\\Users\\Jun\\Desktop\\JavaWeb\\xml pro\\xml\\src\\hr.xml";
SAXReader reader = new SAXReader(); //创建SAXReader对象,用于解析XML
try {
Document document = reader.read(file);
Element hr = document.getRootElement(); //获取根节点
Element employee = hr.addElement("employee"); //创建hr对象下的子节点
employee.addAttribute("no", "A003"); //创建属性
employee.addElement("name").setText("Tony"); //为标签写入值
employee.addElement("age").setText("27");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("电工");
department.addElement("address").setText("电力部");
//将Tony信息写入到XML中,(目前只是在内存中)
//把文件输出流转换成Writer对象 UTF-8防止乱码
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) {
HrWrite hr = new HrWrite();
hr.writeXml();
}
}
运行后,回到XML文档中"ctrl+shift+F"对排版进行自动整理。
XPath路径表达式
XPath路径表达式是XML文档中查找数据的语言
XPath编写需要的条件:Jaxen包
链接:https://pan.baidu.com/s/1CA2GV6alBPCxx0QhxETRNA
提取码:romm
hr.xml
<?xml version="1.0" encoding="UTF-8"?>
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="S001">
<name>测试一号 </name>
<age>23</age>
<salary>3000</salary>
<department>
<dname>CT</dname>
<address>B-1</address>
</department>
</employee>
<employee no="S002">
<name>测试2号</name>
<age>21</age>
<salary>3050</salary>
<department>
<dname>T</dname>
<address>A-2</address>
</department>
</employee>
<employee no="S003">
<name>测试3号</name>
<age>22</age>
<salary>3100</salary>
<department>
<dname>CT</dname>
<address>B-2</address>
</department>
</employee>
<employee no="S004">
<name>测试4号</name>
<age>23</age>
<salary>3150</salary>
<department>
<dname>CT</dname>
<address>C-2</address>
</department>
</employee>
<employee no="S005">
<name>测试5号</name>
<age>24</age>
<salary>3200</salary>
<department>
<dname>T</dname>
<address>B-2</address>
</department>
</employee>
<employee no="S006">
<name>测试6号</name>
<age>25</age>
<salary>3250</salary>
<department>
<dname>CT</dname>
<address>A-2</address>
</department>
</employee>
<employee no="S007">
<name>测试7号</name>
<age>28</age>
<salary>3300</salary>
<department>
<dname>T</dname>
<address>C-2</address>
</department>
</employee>
<employee no="S008">
<name>测试8号</name>
<age>29</age>
<salary>3350</salary>
<department>
<dname>T</dname>
<address>B-2</address>
</department>
</employee>
<employee no="S009">
<name>测试9号</name>
<age>30</age>
<salary>3400</salary>
<department>
<dname>CT</dname>
<address>A-2</address>
</department>
</employee>
<employee no="S010">
<name>测试10号</name>
<age>31</age>
<salary>3450</salary>
<department>
<dname>CT</dname>
<address>B-2</address>
</department>
</employee>
</hr>
XPathTestor.java
package com.dom4j.javaee3;
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 url = "C:\\Users\\Jun\\Desktop\\JavaWeb\\xml pro\\xml\\src\\com\\dom4j\\javaee3\\hr.xml";
SAXReader reader = new SAXReader(); //创建SAXReader对象
try {
Document document = reader.read(url); //读取文件
//执行XPath表达式的核心方法,返回List<Node> Node是Element和Attribute的父类
List<Node> nodes = document.selectNodes(xpathExp);
//for遍历
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTestor xp = new XPathTestor();
xp.xpath("/hr/employee"); // 从根节点hr下获取employee节点,按照顺序获取
xp.xpath("//employee"); // 只要有employee节点,直接获取
xp.xpath("//employee[salary<=3200]"); // 工资小于3200的员工信息
xp.xpath("//employee[name='测试3号']"); // 获取测试3号的信息
xp.xpath("//employee[@no='S001']"); // 通过属性来获取员工信息 如果是integer就不需要''
//以下按照位置来筛选
xp.xpath("//employee[1]");
//获取最后一个员工信息
xp.xpath("//employee[last()]");
//前5名员工的信息 position()表示当前位置
xp.xpath("//employee[position()<=5]");
//提取具体位置
xp.xpath("//employee[3] | //employee[5]");
}
}