Java笔记 XML

XML简介

        XML(EXtensible Markup Language),可扩展标记语言

特点

        XML与操作系统、编程语言的开发平台无关

        实现不同系统之间的数据交换

作用

        数据交互

        配置应用程序和网站

        Ajax基石

XML标签:XML文档内容由一系列标签元素组成       

        语法:<元素名 属性名=“属性值”>元素内容</元素名>

XML编写注意事项

        所有XML元素都必须有结束标签

        XML标签对大小写敏感

        XML必须正确的嵌套

        同级标签以缩进对齐

        元素名称可以包含字母、数字或其他的字符

        元素名称不能以数字或者标点符号开始 元素名称中不能含空格

XML文档结构

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student stuId="1001">
		<name>张三</name>
		<age>19</age>
		<gender>男</gender>
	</student>

	<student stuId="1002">
		<name>李四</name>
		<age>19</age>
		<gender>男</gender>
	</student>
</students>

XML解析器

        解析器类型

                非验证解析器

                检查文档格式是否良好

        验证解析器

                使用DTD检查文档的有效性

解析XML技术

DOM

        基于XML文档树结构的解析

        适用于多次访问的XML文档

特点:比较消耗资源

SAX

        基于事件的解析

        适用于大数据量的XML文档

特点:占用资源少,内存消耗小

DOM4J

        非常优秀的Java XML API

        性能优异、功能强大

        开放源代码

DOM解析XML

        DOM解析XML文件步骤  

                1.创建解析器工厂对象  

                2.解析器工厂对象创建解析器对象  

                3.解析器对象指定XML文件创建Document对象  

                4.以Document对象为起点操作DOM树

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Demo {

	public static void main(String[] args) {
		//获取解析器工场对象
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		
		try {
			//使用解析器工场对象获得解析器对象
			DocumentBuilder db=dbf.newDocumentBuilder();
			//使用解析器对象将XML文件转换为Document对象
			Document document=db.parse("收藏信息.xml");
			//获取收藏信息.xml文件中所有的Brand,可能会获取多个,所以将获取的元素存放在NodeList集合中
			NodeList nl=document.getElementsByTagName("Brand");
			for (int i = 0; i < nl.getLength(); i++) {
				//将节点集合中的元素取出来
				Node node=nl.item(i);
				Element brand=(Element)node;
				String nameVlue=brand.getAttribute("name");
				System.out.println(nameVlue);
				NodeList typeNodes=brand.getChildNodes();
				for (int j = 0; j < typeNodes.getLength(); j++) {
					Node typeNode=typeNodes.item(j);
					//类型判断,如果typeNode能够转换为Element,才进行转换和输出
					if(typeNode.getNodeType()==Node.ELEMENT_NODE){
						Element type=(Element)typeNode;
						String typeValue=type.getAttribute("name");
						System.out.println(" "+typeValue);
					}
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

保存XML文件

步骤

  1. 获得TransformerFactory对象
  2. 创建Transformer对象
  3. 创建DOMSource对象 包含XML信
  4. 息 设置输出属性 编码格式
  5. 创建StreamResult对象 包含保存文件的信息
  6. 将XML保存到指定文件中
//保存XML文件
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建StreamResult对象
StreamResult result=new StreamResult(new FileOutputStream("收藏信息2.xml"));
//把DOM转换为XML文件
transformer.transform(domSource, result);

添加DOM节点 

import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class ParseXMLDemo {

	public static void main(String[] args) {
		/*
		 * 在XML文档中添加品牌为“MOTO”,型号为“A1680”的手机收藏信息
		 * 
		 *  分析如下:
		 * 	首先,根据收藏信息在内存中构建出它的DOM树,要在PhoneInfo的节点上添加品牌节点,需要先找到PhoneInfo节点。
		 *  然后再此DOM树上创建一个新的Brand品牌节点,设置它的属性name为“MOTO”。
		 *  然后根据它在DOM树的位置,把他添加为PhoneInfo的子节点。这样,此DOM树就有了新的结构。
		 *  最后把这个DOM树结构保存到XML文件就可以了。
		 * 实现步骤如下:
		 * 	(1)为XML文档构造DOM树
		 * 	(2)创建新节点,并设置name属性
		 * 	(3)把节点加到其所属父节点上
		 * 	(4)保存XML文档
		 */
		
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document doc=db.parse("收藏信息2.xml");
			//创建Brand节点
			Element brandElement=doc.createElement("Brand");
			brandElement.setAttribute("name", "MOTO");
			//创建Type节点
			Element typeElement=doc.createElement("Type");
			typeElement.setAttribute("name", "A1680");
			//添加为父子关系
			brandElement.appendChild(typeElement);
			Element phoneElement=(Element)doc.getElementsByTagName("PhoneInfo").item(0);
			phoneElement.appendChild(brandElement);
			
			//保存XML文件
			TransformerFactory tf=TransformerFactory.newInstance();
			Transformer transformer=tf.newTransformer();
			DOMSource domSource=new DOMSource(doc);
			//设置编码类型
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			//创建StreamResult对象
			StreamResult result=new StreamResult(new FileOutputStream("收藏信息2.xml"));
			//把DOM转换为XML文件
			transformer.transform(domSource, result);
			System.out.println("数据添加成功");
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}		
	}
}

 修改DOM节点

import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXMLDemo {

	public static void main(String[] args) {
		/*
		 * 示例06:将保存手机收藏信息的XML文档中的手机品牌信息MOTO修改为“摩托罗拉”。
		 * 
		 * 实现步骤如下:
		 * 	(1)为XML文档构造DOM树
		 * 	(2)找到符合修改条件的节点
		 * 	(3)设置该节点的属性为修改值
		 * 	(4)保存XML文档
		 * 分析如下:
		 * 	手机收藏信息的修改仍然要先构建DOM树,要把品牌信息MOTO修改为“摩托罗拉”,
		 * 	先要找到属性为MOTO的Brand节点,然后把name属性设置为“摩托罗拉”,
		 * 	最后将DOM树的修改保存到XML文件中
		 */
		//得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		
		try {
			//从DOM工厂获得DOM解析器
			DocumentBuilder db=dbf.newDocumentBuilder();
			//解析XML文档,得到一个Document对象
			Document doc=db.parse("收藏信息3.xml");
			
			//找到修改的节点
			NodeList nl=doc.getElementsByTagName("Brand");
			//遍历找到元素
			for (int i = 0; i < nl.getLength(); i++) {
				Node node=nl.item(i);
				Element brandElement=(Element)node;
				String brandName=brandElement.getAttribute("name");
				if(brandName.equals("MOTO")){
					brandElement.setAttribute("name","摩托罗拉");
				}
			}
			
			//保存文件
			TransformerFactory df=TransformerFactory.newInstance();
			Transformer transformer=df.newTransformer();
			DOMSource domSource=new DOMSource(doc);
			//设置编码
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			//创建StreamResult对象
			StreamResult result=new StreamResult(new FileOutputStream("收藏信息3.xml"));
			//将DOM转换为XML文件
			transformer.transform(domSource, result);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
}

删除DOM节点

import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXMLDemo {

	public static void main(String[] args) {
		//得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		
		try {
			//从DOM工厂获得DOM解析器
			DocumentBuilder db=dbf.newDocumentBuilder();
			//解析XML文档,得到一个Document对象
			Document doc=db.parse("收藏信息4.xml");
			
			//找到删除的节点
			NodeList nl=doc.getElementsByTagName("Brand");
			//遍历找到节点
			for (int i = 0; i <nl.getLength(); i++) {
				Node node=nl.item(i);
				Element brandElement=(Element)node;
				String brandName=brandElement.getAttribute("name");
				if(brandName.equals("摩托罗拉")){
					brandElement.getParentNode().removeChild(brandElement);
				}
			}
			
			//保存XML文件
			TransformerFactory tf=TransformerFactory.newInstance();
			Transformer transformer=tf.newTransformer();
			DOMSource domSource=new DOMSource(doc);
			//设置编码
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			//创建StreamResult对象
			StreamResult result=new StreamResult(new FileOutputStream("收藏信息4.xml"));
			//将DOM转换为XML文件
			transformer.transform(domSource, result);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}		
	}
}

DOM4J解析XML

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


public class Dmo4j {

	public static Document doc;
	
	public static void main(String[] args) {
		loadDocument();
//		showPhoneInfo();
		addNewPhoneInfo();
//		saveXML("新收藏.xml");
//		updatePhoneInfo();
//		deleteItem();
		showPhoneInfo();
	}

	public static void loadDocument(){
		try{
			SAXReader saxReader = new SAXReader();
			doc = saxReader.read(new File("新收藏.xml"));
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void updatePhoneInfo(){
		// 获取XML的根节点
		Element root = doc.getRootElement();
		int id = 0;
		for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
			Element brand = (Element) itBrand.next();
			id++;
			brand.addAttribute("id", id + "");
		}

		saveXML("src/收藏信息.xml");

	}
	
	public static void deleteItem(){
		// 获取XML的根节点
		Element root = doc.getRootElement();
		int id = 0;
		for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
			Element brand = (Element) itBrand.next();
			if (brand.attributeValue("name").equals("华为")) {
				brand.getParent().remove(brand);
			}
		}
//		saveXML("src/收藏信息.xml");			
	}
	
	public static void showPhoneInfo() {
		// 获取XML的根节点
		Element root = doc.getRootElement();
		// 遍历所有的Brand标签
		for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
			Element brand = (Element) itBrand.next();
			// 输出标签的name属性
			System.out.println("品牌:" + brand.attributeValue("name"));
			// 遍历Type标签
			for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
				Element type = (Element) itType.next();
				// 输出标签的name属性
				System.out.println("\t型号:" + type.attributeValue("name"));
			}
		}

	}
	
	public static void saveXML(String path){
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("GBK"); // 指定XML编码
			XMLWriter writer;
			writer = new XMLWriter(new FileWriter(path), format);
			writer.write(doc);
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void addNewPhoneInfo(){
		// 获取XML的根节点
		Element root = doc.getRootElement();
		// 创建Brand标签
		Element el = root.addElement("Brand");
		// 给Brand标签设置属性
		el.addAttribute("name", "三星");
		// 创建Type标签
		Element typeEl = el.addElement("Type");
		// 给Type标签设置属性
		typeEl.addAttribute("name", "Note4");
		saveXML("新收藏.xml");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值