一文详细讲解JAVA开发中的XML

XML的重点知识

在这里插入图片描述

1. XML介绍与用途

1.1 XML是什么

  • XML的全称是EXtensible Markup Language , 可扩展标记语言
  • 编写XML就是编写标签,与HTML非常类似,扩展.xml
  • 良好的人机可读性
    在这里插入图片描述
XML与HTML的比较
  • XML与HTML非常相似,都是编写标签
  • XML没有预定义标签,HTML存在大量预定义标签
  • XML重在保存与传输数据,HTML用于显示信息
    在这里插入图片描述

1.2 XML的用途

  • Java程序的配置描述文件
  • 用于保存程序的产生的数据
  • 网络间的数据传输

2. XML的文档结构

  • 第一行必须是XML声明(包括版本号和字符集)
    <?xml version="1.0" encoding="UTF-8"?>
    
  • 有且只有一个根节点
  • XML标签的书写规则与HTML相同
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
	<employee no="3301">
		<name>李铁柱</name>
		<age>37</age>
		<salary>3600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B105</address>
		</department>
	</employee>
	<employee no="3302">
		<name>林海</name>
		<age>50</age>
		<salary>7000</salary>
		<department>
			<dname>财务部</dname>
			<address>XX大厦-B106</address>
		</department>
	</employee>
	<employee no="3310">
		<name>李四</name>
		<age>23</age>
		<salary>3000</salary>
		<department>
			<dname>工程部</dname>
			<address>XX大厦-B104</address>
		</department>
	</employee>
</hr>

可以使用浏览器打开检验是否存在语法问题

3.XML标签书写规则

  • 合法的标签名
    标签要有意义,建议使用英文小写字母,不要存在重名的情况!
  • 适当的注释和缩进
  • 合理使用属性
  • 特殊字符与CDATA标签
  • 有序的子元素

4.XML语义约束

  • XML文档结构正确,但可能不是有效的
  • XML语义约束有两种定义方式:DTDXML Schema

DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式。扩展名为.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)>

PCDATA表示纯文本节点

创建XML Schema文件

  • XML Schema比DTD更为复杂,提供了更多功能
  • XML Schema提供了数据类型,格式限定,数据范围等特性
  • XML Schema是W3C标准
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
	<element name="hr">
		<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
		<complexType>
			<sequence>
				<element name="employee" minOccurs="1" maxOccurs="9999">
					<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>

5.Java解析XML

DOM(Document Object Model) 定义了访问和操作XML文档的标准方法,DOMXML文档作为树结构来查看,能够通过DOM树来读写所有的元素。
在这里插入图片描述

Dom4j

  • Dom4j是一个易用的、开源的库,用于解析XML。 它应用于Java平台,具有性能优异、 功能强大和极其易使用的特点。
  • Dom4j将XML视为Document对象。
  • XML标签被Dom4j定义为Elementi对象。

Dom4j下载地址
Reader.java

package com.imooc.dom4j;

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;

public class HrReader {
	public void readXml(){
		String file = "d:/workspace/xml/src/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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		HrReader reader = new HrReader();
		reader.readXml();
	}
	
}

Wirter.java

package com.imooc.dom4j;

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 HrWriter {
	public void writeXml(){
		String file = "d:/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("37");
			employee.addElement("salary").setText("3600");
			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 Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		HrWriter hrWriter = new HrWriter();
		hrWriter.writeXml();
	}
}

6.XPath路径表达式

最常用的就奔表达式

  • 表达式案例:
    在这里插入图片描述
  • 谓语表达式:
    在这里插入图片描述

Xpath实验室

  • Jaxen介绍
    1. Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM
    2. Dom4j底层依赖axen实现XPath查询
    3. Jaxen下载地址:jaxen.codehaus.org(maven.aliyun.com
package com.imooc.dom4j;

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 file = "E:/lianxi/xml/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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		XPathTestor testor = new XPathTestor();
//		testor.xpath("/hr/employee");
//		testor.xpath("//employee");
//		testor.xpath("//employee[salary<4000]");
//		testor.xpath("//employee[name='李铁柱']");
//		testor.xpath("//employee[@no=3304]");
//		testor.xpath("//employee[1]");
//		testor.xpath("//employee[last()]");
		//testor.xpath("//employee[position()<3]");
		testor.xpath("//employee[3] | //employee[8]");
		
	}
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockyBlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值