Java知识点整理–XML

XML标签书写规则

  • 标签名要有意义
  • 建议使用英文小写字母,单词间用"-"分隔
  • 多级标签间不要存在重名的情况
  • 适当的注释和缩进
  • 合理使用标签属性来描述标签和实现标签分组,优先使用标签
  • 多层嵌套的子元素前后顺序应保持一致
  • 标签体中"<",">"等特殊字符会破坏文档结构,解决方案:
    ①使用实体引用,适用与特殊符号比较少的情况:

实体引用

对应符号

说明

&lt;

<

小于

&gt;

>

大于

&amp;

&

和号

&apos;


单引号

&quot;

"

双引号

②使用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库.