Java知识点整理–XML
XML标签书写规则
- 标签名要有意义
- 建议使用英文小写字母,单词间用"-"分隔
- 多级标签间不要存在重名的情况
- 适当的注释和缩进
- 合理使用标签属性来描述标签和实现标签分组,优先使用标签
- 多层嵌套的子元素前后顺序应保持一致
- 标签体中"<",">"等特殊字符会破坏文档结构,解决方案:
①使用实体引用,适用与特殊符号比较少的情况:
实体引用 | 对应符号 | 说明 |
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ’ | 单引号 |
" | " | 双引号 |
②使用CDATA标签
CDATA指的是不由XML解析器进行解析的文本数据,以"<![CDATA["开始,到"]]>"结束,框选内容体后会原样输出.
XML语义约束
即使XML文档结构正确,也可能不是有效的,例如员工档案的XML中不允许出现植物品种标签,XML语义约束规定了XML文档中允许出现哪些元素.其有两种定义方式DTD和XML Schema.
- DTD(Document Type Definition,文档类型定义)
- DTD文件拓展名为.dtd
- 利用<!ELEMENT>标签来定义XML中允许出现的节点和数量
例如: <!ELEMENT hr (employee)> 定义hr节点下只能出现一个employee节点.<!ELEMENT name (#PCDATA)>定义name的标签体只能是文本. <!ATTLIST employee no CDATA "">定义属性 - <!ELEMENT hr (employee+)> hr下至少出现一个employee节点 同理,*为0…n个,?为最多一个
- XML中使用<!DOCTYPE>标签来引用DTD文件,书写格式:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
- XML Schema
- 比DTD更复杂,提供了更多功能
- 提供了数据类型,格式限定,数据范围等特性
- 是W3C标准
- 文件名后缀.xsd
- 文件头定义:
<schema xmlns="http://www.w3.org/2001/XMLSchema">
- 复杂节点:
<complexType> <sequence></sequence></complexType>
- 范围:
<minExclusive value="18"></minExclusive> <maxInclusive value="60"></maxInclusive>
- 属性:
<attribute name="no" type="string" use="required"></attribute>
Dom4j遍历XML
- 使用Dom4j读取XML内容
package com.lgw.dom4j;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class HrReader {
public void readXml() {
String file = "/home/l03099/eclipse-workspace/xml/src/hr.xml";
try {
// SAXReader类是读取XML文件的核心类,用于将XML解析后以"树"形式保存在内存中.
SAXReader reader = new SAXReader();
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 sname = name.getText();
System.out.println(sname);
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"));
Attribute att = employee.attribute("no");
System.out.println(att.getText());
System.out.println("==================================");
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
HrReader reader = new HrReader();
reader.readXml();
}
}
- 使用Dom4j更新XML内容
package com.lgw.dom4j;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Hrwriter {
public void writeXml() {
String file = "/home/l03099/eclipse-workspace/xml/src/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("31");
employee.addElement("salary").setText("3888");
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) {
// TODO: handle exception
}
}
public static void main(String[] args) {
Hrwriter writer = new Hrwriter();
writer.writeXml();
}
}
XPath表达式
- 常用表达式
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从根节点选择 |
// | 从全文中选取,不考虑位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
例如:bookstore/book
选取属于bookstore的所有book子元素; bookstore//book
选取属于bookstore的所有book后代元素;//@lang
选取所有名为lang的属性
- 谓语表达式
对常用表达式增加约束条件,支持函数
[1]:第一个元素;[last()-1]:倒数第二个元素;[@lang]:拥有lang属性的元素
[position()❤️]:前两个元素
Jaxen
Dom4j底层依赖Jaxen实现XPath查询,需要先导入Jaxen库.