XML SAX DOM解析实现增删改查 JSON介绍 DOM4j的介绍和用法实例

本文介绍XML和JSON的特点及应用,详细解释了XML的语法、命名规则、解析技术等,并提供了DOM操作实例,包括如何添加、删除、更新XML元素。

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

XML(EXtensible Markup Langusge)

可扩展标记语言

特点

1、XML与操作系统、编程语言的开发平台无关
2、实现不同操作系统之间的数据交换

##作用
1、数据交换
2、配置应用程序和网站
3、Ajax基石

用法

声明

<?xml version="1.0" encoding="UTF-8"?>

注释

<!--文字描述-->
XML文档内容由一系列标签元素组成

语法

<元素名 属性名="属性值">元素内容</元素名>

注意

1、属性值用引号包裹
2、一个元素可以有多个属性
3、属性值中不能直接包含<、&
4、不建议使用的字符:"、'、>

XML中的转义符列表:

符号转义符
<&lt;
>&gt;
"&quot;
&apos
&&amp
注意
1、所有XML元素都必须有结束标签
2、XML标签对大小写敏感	
3、XML必须正确的嵌套
4、统计标签以缩进对齐
5、元素名称可以包含字母、数学或其他的字符
6、元素名称不能以数字或者标点符号开始
7、元素名称中不能含空格

命名冲突问题

在XML中,元素名称室友开发者定义的,当两个不用的文档使用相同的元素名时,就会发生命名冲突
1)使用前缀避免命名冲突<a:table><a:name></a:name></a:table>
2使用XML命名空间<a:table xmlns a="http://www.w3.org/TR/html"></a:table>
默认命名空间:
1、没有指定前缀的命名空间就会作为页面中元素的默认命名空间
2、除非在标签中使用其他命名空间的前缀,否则解析器都会认为元素是在默认	命名空间下存在
3、一个文档中只能有一个默认的命名空间

解析XML技术

DOM:(Document Object Model)
1、基于XML文档树结构的解析
2、适用于多次访问的XML文档
3、特点:比较消耗资源

SAX

1、基于事件的解析
2、适用于大数据量的XML文档
3、特点:占用资源少,内存消耗小
DOM解析包:org.w3c.dom

DOM解析

常用接口

1、Document表示整个XML文档:
方法:NodeList getElementsBytagName(String Tag)
说明:按文档顺序返回文档中指定标记名称的所有集合
2、Node:该文档树中的当个节点
方法;NodeList getChildNodes()
说明:获取该元素的所有子节点,返回节点集合
3、Element:XML文档中的一个元素
方法:StringgetTagName()
说明:获取元素名称
节点:元素节点、文本节点、属性节点

DOM解析XNL文件的步骤

1、创建解析工厂对象
2、解析器工厂对象创建解析器对象
3、解析器对象指定XML文件创建Document对象
4、一document对象为起点操作DOM树

DOM解析XML,对其的增删改查操作

 public class XMLTest {
	// 设置全局变量document
	Document document = null;
	// 设置文件路径的全局变量
	String path = "F:/MyEclipseWorkspace/Practise/src/cn/kgc/practise18/new.xml";

	// 获取文件创建工厂,创建Document
	public void getDocument() {
		// 获取document工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			// 获取Documentbuilder对象
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 获取文件对象(需要相对路径或绝对路径)
			document = builder.parse(path);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}  catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 向XML中添加元素
	public void addElement(String nodeName, String textContent) {
		// 获取phone节点
		NodeList nodes = document.getElementsByTagName("phone");
		for (int i = 0; i < nodes.getLength(); i++) {
			NodeList types = document.getElementsByTagName("type");
			for (int j = 0; j < types.getLength(); j++) {
				boolean flag1 = ((Element) nodes.item(i)).getAttribute("name").equals(
						nodeName);
				boolean flag2 = ((Element) types.item(j)).getTextContent().equals(
						textContent);
				if (flag1&&flag2) {
						System.out.println("该元素已存在!");
						return;
				} else if (flag1&&!flag2) {
					// 调用创建type节点
					Element typeElement = addTypeNode(textContent);
					nodes.item(i).appendChild(typeElement);
					savaXML();
					return;
				}else if(!flag1&&!flag2){
					// 调用创建node节点
					Element phoneElement = addNode(nodeName);
					// 调用创建type节点
					Element typeElement = addTypeNode(textContent);
					nodes.item(i).getParentNode().appendChild(phoneElement);
					phoneElement.appendChild(typeElement);
					savaXML();
					return ;
				}
			}
		}
	}

	// 创建node节点
	public Element addNode(String nodeName) {
		Element element = document.createElement("phone");
		element.setAttribute("name", nodeName);
		return element;
	}

	// 创建type节点
	public Element addTypeNode(String textContent) {
		Element element = document.createElement("type");
		element.setTextContent(textContent);
		return element;
	}
	//删除节点phone
	public void deleteNodePhone(String PhoneName) {
		boolean flag = false;
		NodeList nodeList = document.getElementsByTagName("phone");
		for (int i = 0; i < nodeList.getLength(); i++) {
			if (((Element)nodeList.item(i)).getAttribute("name").equals(PhoneName)) {
				nodeList.item(i).getParentNode().removeChild(nodeList.item(i));
				flag = true;
				break;
			}
		}
		if (!flag) {
			System.out.println("******************");
			System.out.println("没有您要删除的phone节点!");
			System.out.println("******************");
		}
		savaXML();
	}
	//删除节点type
	public void deleteNodeType(String PhoneName,String content){
		boolean phoneFlag = false;
		boolean typeFlag = false;
		NodeList nodes = document.getElementsByTagName("phone");
		for (int i = 0; i < nodes.getLength(); i++) {
			if (((Element)nodes.item(i)).getAttribute("name").equals(PhoneName)) {
				NodeList types = ((Element)nodes.item(i)).getElementsByTagName("type");
				for (int j = 0; j < types.getLength(); j++) {
					if (((Element)types.item(j)).getTextContent().equals(content)) {
						nodes.item(i).removeChild(types.item(j));
						System.out.println("删除type-"+content+"成功!");
						typeFlag = true;
					}
				}
				phoneFlag = true;
			}
		}
		if (!phoneFlag) {
			System.out.println("没有找到phone-"+PhoneName+"节点!");
			if (!typeFlag) {
				System.out.println("没有找到phone-"+PhoneName+"节点下type"+content+"节点!");
			}
		}
		savaXML();
	}
	//更新XML中的phone-name内容
	public void updatePhoneName(String oldPhoneName,String newPhoneName) {
		boolean flag = false;
		NodeList nodes = document.getElementsByTagName("phone");
		for (int i = 0; i < nodes.getLength(); i++) {
			if (((Element)nodes.item(i)).getAttribute("name").equals(oldPhoneName)) {
				((Element)nodes.item(i)).setAttribute("name", newPhoneName);
				System.out.println("修改phone-name属性成功");
			}
		}
		if (!flag) {
			System.out.println("没有找到phone-name="+oldPhoneName+",删除失败!");
		}
		savaXML();
	}
	//更新type内容
	public void updateType(String phoneName,String oldType,String newType) {
		boolean phoneFlag = false;
		boolean typeFlag = false;
		NodeList nodes = document.getElementsByTagName("phone");
		for (int i = 0; i < nodes.getLength(); i++) {
			if (((Element)nodes.item(i)).getAttribute("name").equals(phoneName)) {
				NodeList types = ((Element)nodes.item(i)).getElementsByTagName("type");
				for (int j = 0; j < types.getLength(); j++) {
					if (((Element)types.item(j)).getTextContent().equals(oldType)) {
						((Element)types.item(j)).setTextContent(newType);
						typeFlag = true;
					}
				}
				phoneFlag = true;
			}
		}
		if (!phoneFlag) {
			System.out.println("没找到phone-name="+phoneName+"的手机!");
			if (!typeFlag) {
				System.out.println("没找到phone-neme"+phoneName+",type="+oldType+"的数据。");
			}
		}
		savaXML();
	}	
	public void showInfor() {
		// 获取根节点
		NodeList nodes = document.getElementsByTagName("phone");
		for (int i = 0; i < nodes.getLength(); i++) {
			// 获得phone节点
			Element e = (Element) nodes.item(i);
			// 打印phone节点中的name属性
			System.out.println(e.getAttribute("name"));
			// 获得phone节点下的子节点type节点
			NodeList types = e.getElementsByTagName("type");
			for (int j = 0; j < types.getLength(); j++) {
				// 获得子节点type的第j个type标签元素
				//System.out.println(Node.ELEMENT_NODE);
				Element typeElement = (Element) types.item(j);
				System.out.println("\t" + typeElement.getTextContent());
			}
		}
	}

	// 保存XML
	public void savaXML() {
		// 获取解析器工厂
		TransformerFactory factory = TransformerFactory.newInstance();
		try {
			// 获取解析器
			Transformer former = factory.newTransformer();
			// 获取DOMSource资源
			DOMSource source = new DOMSource(document);
			// 获取流结果StreamResult
			StreamResult result = new StreamResult(path);
			// 调用解析器中的transformer方法将XML保存到指定路径
			former.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		// 创建对象
		XMLTest xmlTest = new XMLTest();
		// 调用getDocument方法
		xmlTest.getDocument();
		// 调用showInfor方法
		// xmlTest.showInfor();
		//xmlTest.addElement("小米", "10");
		//xmlTest.deleteNodePhone("小米");
		//xmlTest.deleteNodeType("小米", "10");
		//xmlTest.updatePhoneName("荣耀", "华为");
		//xmlTest.updateType("华为", "P40", "P40 Pro");
		xmlTest.showInfor();
	}
}

保存XML文件的步骤

1、获得TransformerFactory
2、创建Transformer对象
		设置输出属性
3、创建DOMSource对象
		包含XML信息
4、创建StreamResult对象
		包含保存文件信息
5、将XML保存到指定文件中
// 保存XML
	public void savaXML() {
		// 获取解析器工厂
		TransformerFactory factory = TransformerFactory.newInstance();
		try {
			// 获取解析器
			Transformer former = factory.newTransformer();
			// 获取DOMSource资源
			DOMSource source = new DOMSource(document);
			// 获取流结果StreamResult
			StreamResult result = new StreamResult(path);
			// 调用解析器中的transformer方法将XML保存到指定路径
			former.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}

	}

JSON(JavaScript Object Notation)

1、轻量级的文本数据交换格式
2、具有自我描述性
3、比XML传输速度块
JSON:www.json.cn

语法

两种数据结构:对象和数组
1、大括号内为对象
2、中括号为数组
对象中的数据由名称/值对构成
1、值的类型可为字符串、数字、布尔值、null、数组、对象
2、数据之间由逗号分隔
数组中的数据类型同名称/值对中值的类型

Fastjson

下载地址:http://central.maven.org/maven2/com/alibaba/fastjson

DOM4J

1、非常优秀的java XML API
2、性能优异、功能强大
3、开放源代码

常用接口

Document接口:定义XML文档
Element接口:定义XML元素
Text接口:定义XML文本节点
Attribute接口:定义XML属性
。。。。
DOM4j下载地址:Https://dom4j.gitubb.io/

基于DOM4j对XML的增删改查

public class DOM4jTest {
	Document document = null; //创建Document的全局变量
	String path = "book.xml";//创建XML的全局路径
	//获取Document对象
	public void getDocument() {
		SAXReader reader = new SAXReader();//创建SAXReader对象
		try {
			document = reader.read(path);//获取document
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	//打印输出book.xml中的内容
	public void showInfor() {
		Element root = document.getRootElement();//获取根节点
		for(Iterator<Element> bookIterator=root.elementIterator();bookIterator.hasNext();){//通过迭代器遍历root下的子节点
			Element book = bookIterator.next();//获取子节点元素
			System.out.println(book.attributeValue("name"));//打印输出book的name属性
			List<Element> fieldList = book.elements();//将book的子节点封装到List集合中
			for (int i = 0; i < fieldList.size(); i++) {
				Element field = fieldList.get(i);//得到book的子节点
				System.out.println("\t"+field.getText());//打印输出book子节点的内容
			}
		}
	}
	//保存XML
	public void savaXMl(){
		OutputFormat format = OutputFormat.createPrettyPrint();//创建OutputFormat对象
		format.setEncoding("GB2312");//设置编码格式为UTF-8
		XMLWriter writer = null;//声明XMLwriter
		OutputStream out = null;
		try {
			out = new FileOutputStream(path);
			writer = new XMLWriter(out,format);//创建XMLwriter对象,并将format格式传入
			writer.write(document);//写出文件
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				//关闭流
				writer.close();
				out.close();
				} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	//增加XML
	public void addNode(String nodeName,String courseName,String authorName) {
		Element root = document.getRootElement();//获取根节点
		Element book = root.addElement("book");//添加book节点
		book.addAttribute("name", nodeName);//将book节点的name属性设置成nodeName
		Element name = book.addElement("name");//添加name节点
		name.addText(courseName);//在name的文本中添加courseName
		Element author = book.addElement("author");//添加author节点
		author.addText(authorName);//在author的文本中添加authorName
		savaXMl();
	}
	//删除XMl
	public void deleteXML(String courseName) {
		Element root = document.getRootElement();//获取根元素
		for(Iterator<Element> bookiIterator=root.elementIterator();bookiIterator.hasNext();){//通过迭代器遍历
			Element book = bookiIterator.next();//获取迭代器中的book元素
			List<Element> fieldList = book.elements();//将book的子元素封装到List集合中
			for (int i = 0; i < fieldList.size(); i++) {//循环遍历
				Element field = fieldList.get(i);//获取book下的子节点
				if (field.getName().equals("name")&&field.getText().equals(courseName)) {//判断是否是name节点,并且节点的文本中是否是courseName
					root.remove(book);//移除该book节点
					System.out.println("删除成功!");
				}
			}
		}
		savaXMl();
	}
	//修改XMl
	public void updateXMl(String nodeName,String CourseName,String authorName) {
		Element root = document.getRootElement();//获取根节点
		for(Iterator<Element>bookiIterator=root.elementIterator();bookiIterator.hasNext();){//利用迭代器遍历根节点的子节点
			Element book = bookiIterator.next();//获取子节点
			if (book.attributeValue("name").equals(nodeName)) {//判断book的name属性是不是nodeName				for(Iterator<Element>fieldIterator=book.elementIterator();fieldIterator.hasNext();){//迭代器遍历子节点
					Element field = fieldIterator.next();//获取name和author子节点
					if (field.getName().equals("name")) {//判断field的name是不是name,是的话修改文本为courseName
						field.setText(CourseName);						
					}else {//如果field不是name是author,则将author设置成authorName
						field.setText(authorName);
					}
				}
				break;
			}
		}
		savaXMl();
	}
	//主函数
	public static void main(String[] args) {
		DOM4jTest dom4jTest  = new DOM4jTest();
		//获取Document
		dom4jTest.getDocument();
		//添加XML
		//dom4jTest.addNode("book4", "数学", "高达");
		//删除XMl中内容
		//dom4jTest.deleteXML("数学");
		//更新XML
		dom4jTest.updateXMl("book3", "数据结构", "大大");
		//打印输出
		dom4jTest.showInfor();		
	}
}

//相应的XML的文档

<?xml version="1.0" encoding="GB2312"?>
<books> 
  <book name="book1"> 
    <name>java开发</name>  
    <author>圆圆</author> 
  </book>  
  <book name="book2"> 
    <name>web开发</name>  
    <author>橙橙</author> 
  </book>  
  <book name="book3"> 
    <name>数据结构</name>  
    <author>大大</author> 
  </book>  
  <book name="book4"> 
    <name>数学</name>  
    <author>高达</author> 
  </book>  
  <book name="book4"> 
    <name>数学</name>  
    <author>高达</author> 
  </book> 
</books>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值