Day25-XML解析

总结

我是最棒的!基础不牢,地动山摇!

XML解析

Document 文档对象

Node 节点对象

NodeList 节点列表

Element 元素对象

JAXP原生解析

处于org.w3c.xml包下

Transformer 同步内存到磁盘上

通过实例来认识

package cn.itsource.xml;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
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.xml.sax.SAXException;


/**
 * 解析 XML文件 需求: 
 * 1、得到某个具体的文本节点的内容:取出第二个联系人的名字
 * 2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
 * 3、向指定元素节点中增加子元素节点:增加一个联系人信息 
 * 4、操作XML文件属性:设置/获取联系人的id属性 
 * 5、删除指定元素节点:删除第三个联系人信息
 */
public class XMLParseTest {

	private static Document document;
	
	static{
			try {
				document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("resources/contacts.xml");
			} catch (SAXException | IOException | ParserConfigurationException e) {
				e.printStackTrace();
			}
		
	}
	
	public static void main(String[] args) {
		//1、得到某个具体的文本节点的内容:取出第二个联系人的名字
		//get();
		//2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
		//update();
		//3、向指定元素节点中增加子元素节点:增加一个联系人信息
//		add();
		//4、操作XML文件属性:设置/获取联系人的id属性
		//updateAttribute();
		//5、删除指定元素节点:删除第三个联系人信息
//		remove();
		remove2();
		
	}
	
	/**
	 * 1、得到某个具体的文本节点的内容:取出第二个联系人的名字
	 */
	public static void get(){
		String textContent = document.getElementsByTagName("name").item(1).getTextContent();
		System.out.println(textContent);
	}
	
	/**
	 * 2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
	 */
	public static void update(){
		document.getElementsByTagName("email").item(0).setTextContent("[email protected]");
		transform();
	}
	
	/**
	 * 3、向指定元素节点中增加子元素节点:增加一个联系人信息 
	 */
	public static void add(){
		//获取根元素
		Element root = document.getDocumentElement();
		//创建一个联系人linkman
		Element linkman = document.createElement("linkman");
		//在根元素中添加
		root.appendChild(linkman);
		
		Element name = document.createElement("name");
		name.setTextContent("xxx");
		linkman.appendChild(name);
		
		Element email = document.createElement("email");
		email.setTextContent("[email protected]");
		linkman.appendChild(email);
		
		Element address = document.createElement("address");
		address.setTextContent("xxxyyy");
		linkman.appendChild(address);
		
		Element group = document.createElement("group");
		name.setTextContent("itsource");
		linkman.appendChild(group);
		
		transform();
	}
	
	/**
	 * 4、操作XML文件属性:设置/获取联系人的id属性 
	 */
	public static void updateAttribute(){
		Element attr = (Element)document.getElementsByTagName("linkman").item(2);
		attr.setAttribute("id", "3");
		System.out.println(attr.getAttribute("id"));
		
		transform();
	}
	
	/**
	 * 5、删除指定元素节点:删除第三个联系人信息
	 */
	public static void remove(){
		//获取根元素
		Element root = document.getDocumentElement();
		//获取要删除的元素
		Node linkman = document.getElementsByTagName("linkman").item(2);
		//删除
		root.removeChild(linkman);
		
		transform();
	}
	
	public static void remove2(){
		//获取要删除的元素
		Node item = document.getElementsByTagName("linkman").item(2);
		Node parentNode = item.getParentNode();
		parentNode.removeChild(item);
		
		transform();
	}
	
	/**
	 * 同步方法,将在内存中操作的数据同步到文档中
	 */
	public static void transform(){
		DOMSource source = new DOMSource(document);
		StreamResult result = new StreamResult("resources/contacts.xml");
		try {
			TransformerFactory.newInstance().newTransformer().transform(source, result);
		} catch (TransformerException | TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		}
		
	}

}

DOM4j(DOM for Java)解析

DOM4j解析中用到的全部是dom4j包中的类

操作方法比起原生解析更为简单

实例

package cn.itsource.dom4j;

import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Before;
import org.junit.Test;
/**
 * 解析 XML文件 需求: 
 * 1、得到某个具体的文本节点的内容:取出第二个联系人的名字
 * 2、修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
 * 3、向指定元素节点中增加子元素节点:增加一个联系人信息 
 * 4、操作XML文件属性:设置/获取联系人的id属性 
 * 5、删除指定元素节点:删除第三个联系人信息
 */
public class DOM4jTest {
	
	private Document document;
	private String path = "resources/contacts.xml";
	
	@Before
	public void init() throws Exception{
		SAXReader reader = new SAXReader();
		document = reader.read(path);
	}
	
	/**
	 * 得到某个具体的文本节点的内容:取出第二个联系人的名字
	 * @throws Exception
	 */
	@Test
	public void getName() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//获取根元素下一级的linkman列表
		List<Element> list = root.elements("linkman");
		//获取第二个linkman
		Element element = list.get(1);
		//获取第二个linkman的name元素
		Element name = element.element("name");
		//打印name元素中的文本
		System.out.println(name.getText());
	}
	/**
	 * 修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
	 * @throws Exception
	 */
	@Test
	public void update() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//获取linkman列表中的第一个
		Element linkman = (Element) root.elements("linkman").get(0);
		//获取第一个联系人的邮箱并且改掉
		linkman.element("email").setText("[email protected]");
		//同步方法
		transform();
	}
	
	/**
	 * 向指定元素节点中增加子元素节点:增加一个联系人信息 
	 * @throws Exception
	 */
	@Test
	public void add() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//增加一个联系人
		Element element = root.addElement("linkman");
		//设置联系人属性
		element.addElement("name").setText("xxx");
		element.addElement("email").setText("[email protected]");
		element.addElement("address").setText("yyy");
		element.addElement("group").setText("itsource");
		transform();
	}
	
	/**
	 * 操作XML文件属性:设置/获取联系人的id属性 
	 * @throws Exception
	 */
	@Test
	public void attribute() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//获取联系人列表 获得第一个联系人
		Element linkman = (Element) root.elements().get(0);
		//获取id属性
//		String text = linkman.attribute("id").getText();
		String text = linkman.attributeValue("id");
		System.out.println(text);
		
		linkman.attribute("id").setText("666");
		transform();
	}
	
	/**
	 * 删除指定元素节点:删除第三个联系人信息
	 * @throws Exception
	 */
	@Test
	public void remove() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//直接删除
		Element ele = (Element) root.elements("linkman").get(2);
		root.remove(ele);
		
		transform();
	}
	
	@Test
	public void print() throws Exception{
		//获取根元素
		Element root = document.getRootElement();
		//打印属性
		Iterator<Element> elementIterator = root.elementIterator("linkman");
		while (elementIterator.hasNext()) {
			Element next = elementIterator.next();
			System.out.println(next.attributeValue("id"));
			System.out.println(next.element("name").getText());
			System.out.println(next.element("email").getText());
			System.out.println(next.element("address").getText());
			System.out.println(next.element("group").getText());
//			Element next = elementIterator.next();
//			System.out.println(next);
		}
	}
	
	/**
	 * 同步方法
	 * @throws Exception
	 */
	public void transform() throws Exception{
		//生成漂亮格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(new FileWriter(path), format);
		writer.write(document);
		writer.close();
	}
	
}

猜你喜欢

转载自blog.csdn.net/t384061961/article/details/100545627
今日推荐