Java解析和编辑XML
资料来源
资料来源:
https://www.cnblogs.com/yaobolove/p/5568128.html
https://blog.csdn.net/qq_39237801/article/details/78378486
测试用xml文件
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="0">
<name>yaobo</name>
<age>22</age>
<sex>male</sex>
</user>
<user id="1">
<name>学生</name>
<age>24</age>
<sex>Male</sex>
</user>
<user id="2">
<name>wjm</name>
<age>23</age>
<sex>male</sex>
</user>
<user id="3">
<name>wh</name>
<age>24</age>
<sex>Male</sex>
</user>
<user >
<name>yaobo</name>
<age>12</age>
</user>
</users>
DOM(Document Object Model)
介绍及优缺点分析
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
DOM解析和写入代码
package com.origin.xml.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class Dom {
/***
* dom方式解析xml
*
*/
public void parser(String url){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse(url);
NodeList users=doc.getChildNodes();
for(int i=0;i<users.getLength();i++){
Node user=users.item(i);
//这次取出的是节点users
//System.out.println(user.getNodeName()+users.getLength());
NodeList userList=user.getChildNodes();
for(int j=0;j<userList.getLength();j++){
Node info=userList.item(j);
//这次取出的是节点user
//System.out.println(info.getNodeName());
NodeList attribute=info.getChildNodes();
//System.out.println(attribute.item(0).getNodeName()+":"+attribute.item(0).getTextContent());
for(int k=0;k<attribute.getLength();k++){
if(attribute.item(k).getNodeName() != "#text"){
//这次取出的user下面的属性节点
System.out.println(attribute.getLength()+attribute.item(k).getNodeName()+":"+attribute.item(k).getTextContent());
}
}
System.out.println();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* dom生成xml方法
*/
public void createXml(){
try {
// 创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.newDocument();
// 不显示standalone="no"
document.setXmlStandalone(true);
Element bookstore = document.createElement("bookstore");
// 向bookstore根节点中添加子节点book
Element book = document.createElement("book");
Element name = document.createElement("name");
// 不显示内容 name.setNodeValue("不好使");
name.setTextContent("雷神");
book.appendChild(name);
// 为book节点添加属性
book.setAttribute("id", "1");
// 将book节点添加到bookstore根节点中
bookstore.appendChild(book);
// 将bookstore节点(已包含book)添加到dom树中
document.appendChild(bookstore);
// 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
// 创建 Transformer对象
Transformer tf = tff.newTransformer();
// 输出内容是否使用换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// 创建xml文件并写入内容
tf.transform(new DOMSource(document), new StreamResult(new File("src/book1.xml")));
System.out.println("生成book1.xml成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成book1.xml失败");
}
}
@Test
public void DomWriterTest(){
Long start = System.currentTimeMillis();
createXml();
System.out.println("运行时间:"+ (System.currentTimeMillis() - start));
}
@Test
public void DomTest(){
String url = "src/users.xml&