5-XML扩展标记语言

本文介绍了XML的基础知识、XML语法特点及与HTML的区别,并详细探讨了三种主流的XML解析技术:DOM、SAX和DOM4J。此外,还提供了基于DOM4J进行XML操作的具体示例,包括如何使用XPath进行节点定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是XML

XML:eXtensible Markup Language 可扩展标记语言

  • 可扩展:所有标签都是自定义的
  • 功能:数据存储、配置文件、数据传输
  • xml和html区别:

html语法松散,xml语法严格
html做页面展示,xml做数据存储
html所有标签都是预定义的,xml都是自定义的

XML语法

<?xml version="1.0" encoding="UTF-8"?>
<!-- 文档声明,必须写在第一行-->

	<!-- 
		version ="版本号"
		encoding ="字符集"
	-->

<!-- 
	注释可以出现在除标签内部以为的任何位置。注释不能嵌套!
-->
	 
<!-- 元素的写法 -->
	<!-- 
		1、文档中有且只有一个根元素
		2、元素需要正确闭合
		3、元素必须正确嵌套
		4、元素的命名规范
			区分大小写、不能以数字或xml开头、不能包含空格
	 -->

<!-- 文档解析
	jaxp sun公司开发(但自己都不用)
	jdom 开源组织开发的
	dom4j 开源组织,sun也用
		jdom的升级产品
		DOM4j的使用:参考Dom4j.java
		
 -->
 
<!-- 根元素,有且只有一个 -->
<persons><!-- 头标签 -->
	<!-- 子元素
		 属性必须用引号,单引双引都可以
	-->
	<person id='p1'>
		<name>张三</name>
		<age>11</age>
	</person>
	<person id="p2">
		<!-- 文本
			转义字符:&开头;结尾 
			<![CDATA[文本]]>
		 -->
		<name>李四<![CDATA[if(a>b&&a<c)]]></name>
		<age>&lt;&amp;</age>
	</person>
</persons><!-- 尾标签 -->

XML解析JAVA技术介绍

1、DOM Document Object Model 文档对象模型
关键字:树(Document)
优点:把XML文件在内存中构造树形结构,可以遍历和修改
缺点:如果文件较大,内存有压力,解析的时间会比较长

2、SAX Simple API for XML 基于XML的简单API
关键字:流(Stream)
把XML作为输入流,触法标记开始,内容开始,标记结束等
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对节点做修改

3、JDOM/DOM4J
DOM4J结合了DOM和SAX两种解析方式的优点

基于DOM4J操作XML

package com.offcn.xml;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;

/**
 * DOM4j的使用
 * 使用需导入jar包
 * 	DOM4J:dom4j-1.6.1.jar
 */
public class Dom4j {
	
	@Test
	public void run1() throws Exception {
		//解析XML
		//0、创建解析XML的核心对象
		SAXReader reader = new SAXReader();
		//0、读取加载需要解析的xml
		Document document = reader.read("src/com/offcn/xml/Demo1.xml");
		
		//1、获取xml中的根元素
		Element rootElement = document.getRootElement();
		//getName()获取标签名
//		System.out.println(rootElement.getName());
		
		//2、获取根元素下的所有子元素
		List<Element> list = rootElement.elements();
//		for (Element e : list) {
//			System.out.println(e.getName());
//		}
		
		//3、获取元素的属性值
		Element p1 = list.get(0);//第一个person元素
		//3.1、p1.attribute("id").getValue()
		//attribute取到的是整个属性
		Attribute attribute = p1.attribute("id");
//		System.out.println(attribute);
		//attribute.getValue()取到属性对应的值
		String value = attribute.getValue();
//		System.out.println(value);
		
		//3.2、直接通过元素获取当前的值
		String attributeValue = p1.attributeValue("id");
//		System.out.println(attributeValue);
		
//		System.out.println("-----------------------------------");
		
		//4、获取指定元素下的子元素
		Element pname = p1.element("name");//第一个person元素下的name元素
//		System.out.println(pname);
		//获取标签的标签名
//		System.out.println(pname.getName());
		
		//5、获取元素内的文本
//		System.out.println(pname.getText());
		
		//5.1获取指定元素下的子元素的文本
//		System.out.println(p1.elementText("age"));
		
	}
}

XPath操作XML

package com.offcn.xml;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;

/**
 * XPath
 * 基于Dom4j的免费工具
 * 
 * 使用需导入jar包
 * 	DOM4J:dom4j-1.6.1.jar
 * 	XPath:jaxen-1.1-beta-6.jar
 * 
 * 简化DOM4J的操作,定位更准确
 *
 * 可参考本机G:\offcn\API\API-JavaEE\WEB\XPathTutorial实例教程
 */
public class XPath {

	@Test
	public void run1() throws Exception {
		
		//0、创建解析XML的核心对象
		SAXReader reader = new SAXReader();
		//0、将XML文件加载到内存中
		Document document = reader.read("src/com/offcn/xml/demo1.xml");
		
		//1、获取节点对象
		
		//1.1、获取单节点对象
		Node node = document.selectSingleNode("/persons/person/name");
		System.out.println(node.getText());
		
		//1.2、获取多节点对象
		List<Node> nodes = document.selectNodes("//*");
		for (Node n : nodes) {
			System.out.println(n.getName()+" "+n.getText());
		}
		
		
	}
	
	@Test
	public void run2() throws Exception {
		
		//0、创建解析XML的核心对象
		SAXReader reader = new SAXReader();
		//0、将XML文件加载到内存中
		Document document = reader.read("src/com/offcn/xml/demo1.xml");
		
		//
		List<Node> nodes = document.selectNodes("//*[@id='p2']/name");
		for (Node n : nodes) {
			System.out.println(n.getName()+" "+n.getText());
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值