Day25-XML解析
作者:互联网
Day25
总结
我是最棒的!基础不牢,地动山摇!
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("xxx@qq.com");
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("xxx@qq.com");
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("xxx@qq.com");
//同步方法
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("xxx@xx.com");
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();
}
}
标签:XML,document,Day25,linkman,联系人,Element,import,解析,节点 来源: https://blog.csdn.net/t384061961/article/details/100545627