学习java的第三十三天。。。(XML解析)

DOM解析XML

保存XML文件

获得TransformerFactory对象
创建Transformer对象
创建DOMSource对象---包含XML信息
设置输出属性---编码格式
创建StreamResult对象---包含保存文件的信息
将XML保存到指定文件中

    //保存XML文件:将java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
	public void savaXML(String path){
		//创建转换器工厂对象
		TransformerFactory factory=TransformerFactory.newInstance();
		//设置首行缩进,4个字符
		factory.setAttribute("indent-number", "4");
		try {
			//通过转换器工厂对象创建转换器对象
			Transformer transformer=factory.newTransformer();
			//设置存储的格式
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");

//			StreamResult result=new StreamResult(new FileOutputStream(path));
			StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
//			StreamResult result=new StreamResult(path);
			DOMSource  source=new DOMSource(document);
			/*
			 * 通过转换器对象调用方法将java内存中的document对象存储到外部xml文件中,transform(Source source,Result result)
			 * 需要两个参数,Source标识源头,也就是java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DomSource
			 * Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
			 */
			
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

添加DOM节点

通过Document调用方法创建一个元素节点
通过创建的元素节点调用方法给元素节点设置属性及属性值
将创建好的两个节点建立关系
获取xml文件中创建好的标签的上一个元素节点,然后将创建好的标签作为子节点追加到获取元素节点中,一直追加到无法追加为止
元素添加完毕之后需要将java内存中的document对象存储到xml文件中 

    //添加元素到XML文件中
	public void add(){
		//通过Document调用方法创建一个元素节点
		Element element=document.createElement("Brand");
		//通过创建的元素节点调用方法给元素节点设置属性及属性值
		element.setAttribute("name", "三星");
		//通过Document调用方法创建一个元素节点
		Element ele1=document.createElement("Type");
		//通过创建的元素节点调用方法给元素节点设置属性及属性值
		ele1.setAttribute("name", "Note3");
		//将创建好的两个节点建立关系
		element.appendChild(ele1);
		//获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
		document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
		//元素添加完毕之后需要将java内存中的document对象存储到xml文件中
		this.savaXML("收藏信息.xml");
	}

修改DOM节点

通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
遍历节点集合:修改节点(给节点添加了一个id属性)
取出节点集合中的元素
将节点元素转换成其真正的类型
给元素节点添加了一个新的属性id

    //修改:修改xml文件中的内容
	public void update(){
		//通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
		NodeList brands=document.getElementsByTagName("Brand");
		//遍历节点集合:修改节点(给节点添加了一个id属性)
		for(int i=0;i<brands.getLength();i++){
			//取出节点集合中的元素
			Node brand=brands.item(i);
			//将节点元素转换成其真正的类型
			Element eleBrand=(Element)brand;
			//给元素节点添加了一个新的属性id
			eleBrand.setAttribute("id", i+"");
		}
		this.savaXML("收藏信息.xml");
	}

删除DOM节点

通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
遍历集合 取出节点集合中的元素
将节点转换成真正的类型
从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点

    public void delete(){
		//通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
		NodeList brands=document.getElementsByTagName("Brand");
		//遍历集合
		for(int i=0;i<brands.getLength();i++){
			//取出节点集合中的元素
			Node brand=brands.item(i);
			//将节点转换成真正的类型
			Element eleBrand=(Element)brand;
			//从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
			if(eleBrand.getAttribute("name").equals("华为")){
				//删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
				eleBrand.getParentNode().removeChild(eleBrand);
			}
		}
		this.savaXML("收藏信息.xml");
	}

DOM4J解析XML

DOM4J

Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性

使用DOM4J需要导入文件,https://dom4j.github.io/#parsing 在这里面可以找到

 随便找一个,下载.jar文件。下载好之后接下来就是导入包了

 

将刚才下载下来的文件复制到刚刚创建的文件夹中 

 

 

 

 

 

 

 

 

 这样就好了。

public class Dom4j {

	public static Document doc;
	
	public static void main(String[] args) {
		loadDocument();
//		showPhoneInfo();
//		saveXML("收藏信息.xml");
//		addNewPhoneInfo();
//		updatePhoneInfo();
		deleteItem();
		showPhoneInfo();
	}
	
	//定义方法,将xml文件转换为document对象
	public static void loadDocument(){
		try{
			//创建SAXReader类对象,调用reader()方法将XMl文件转换为document类对象
			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("收藏信息.xml");
	}
	
	public static void deleteItem(){
		// 获取XML的根节点
		Element root = doc.getRootElement();
		for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
			Element brand = (Element) itBrand.next();
			if (brand.attributeValue("name").equals("华为")) {
				//删除元素需要通过其父元素来进行删除
				brand.getParent().remove(brand);
			}
		}
		saveXML("收藏信息.xml");			
	}
	
	//定义方法显示XML文件中的手机品牌和类型
	public static void showPhoneInfo() {
		// 获取XML的根节点
		Element root = doc.getRootElement();
		// 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签
		for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
			Element brand = (Element) itBrand.next();
			// attributeValue(属性名: )根据属性名输出标签的name属性
			System.out.println("品牌:" + brand.attributeValue("name"));
			// 使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
			for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
				Element type = (Element) itType.next();
				// attributeValue(属性名: )根据属性名输出标签的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("src/收藏信息.xml");
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

放在糖果旁的是我很想回忆的甜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值