当前位置: 首页 > 工具软件 > JAXP > 使用案例 >

JAXP解析XML

祖浩淼
2023-12-01

JAXP解析XML

JAXP代码实现步骤

① 获取Document

我们在进行XML的时候,首先要拿到的肯定是实体文件在内存中的对象,API中叫Document
JDK文档中Document是个接口类型,不能通过new等方式去获取到

  1. 获取解析器工厂对象
  2. 解析器工厂对象创建解析器对象
  3. 解析器解析实体XML文件返回Document对象

示例代码

//获取解析器工程对象
DocumentBuilderFactory factor = new DocumentBuilderFactory.newInstance();
//解析器工厂对象创建解析器对象
DocumentBuilder builder = factor.newDocumentBuilder();
//解析器解析实体XML文件返回Document对象
Document document = builder.parse(File file);//此处传入要解析的xml文件的File对象
② 查询

示例代码

//getDocumentElement()方法 获取document中的根元素
Element root = document.getDocumentElement();
//getRlementsByTagName("元素名")方法 获取多个root下的次级元素
NodeList linkmanList = root.getRlementsByTagName("元素名");
//item(int index)方法获取指定索引元素 getTextContent()获取元素值
String value = linkmanList.item(0).getTextContent();
③ 修改

在XML解析的过程中,若对数据进行了修改操作,那么Java代码实际上只对内存中的这个对象进行了修改操作,要将最后的修改实际保存到文件中,还需要将当前内存中的数据输出保存到实际的XML,这个时候需要使用到Transformer类

API

Node接口:
//设置节点中的文本内容
void setTextContent(设置的值)

//写入到到文件中
TransformerFactory类:
	//创建转换器新实例对象
	TransformerFactory newInstance();
	//创建一个新的转换器
	Transformer newTransformer();
Transformer类:
	//将内存中的DOM模型数据,写入实体文件中
	void transformer(数据源,结果);
	DOMSource(内存的文档对象中);
	StreamResult(实体文件关联);

示例代码

//修改指定元素
linkmanList.item(0).setTextContent("新的值");
//获取转换器
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//将修改的内存中的内容写入文件
transformer.transform(new DOMSource(docment), new StreamResult("xml文件的路径"));
④ 删除

注意:删除节点的时候,需要使用元素本身的父节点去删除

API

Node接口:
//获取父节点
Node getParentNode();
//删除子节点
void removeChild(Element对象);

示例代码

//节点删除子节点
linkmanList.removeChild(Element对象);
//节点获取父节点以删除自身
node.getParentNode().removeChild(node);
⑤ 增加

API

Element接口:
//创建一个新的标签
Element createElement(标签名称)
//将一个标签添加到另一个标签中
void appendChild(Element对象)
//给标签添加一个属性
void setAttribute(属性名,属性值)
//根据属性名获取值
String getAttribute(属性名)

一个完整的从创建、新增到写入文件的过程演示代码

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
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.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 TestDOM {
	
	/**
	 * 用于创建指定XML文件路径的DOM对象
	 * @param file:指定XML文件的文件路径
	 * @return:返回一个Document对象
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public Document getDocment(File file) throws ParserConfigurationException, SAXException, IOException{
		
		//工厂对象
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//获取DOM解析器对象
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//获取DOM对象
		Document document = documentBuilder.parse(file);
		//返回指定XML文件的DOM对象
		return document;
		
	}
	
	/**
	 * 用于获得一个没有指定XML的DOM对象
	 * @return:返回没有指定XML的DOM对象
	 * @throws ParserConfigurationException
	 */
	public Document getDocment() throws ParserConfigurationException{
		
		//工厂对象
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//DOM解析器对象
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//获取DOM对象
		Document document = documentBuilder.newDocument();
		//返回没有指定XML的DOM对象
		return document;
	}

	/**
	 * 根据指定文件路径创建预先设置默认内容的XML文件
	 * @param file:文件路径的字符串表现形式
	 * @throws ParserConfigurationException 
	 * @throws TransformerException 
	 * @throws FileNotFoundException 
	 */
	public void createXML(String file) throws ParserConfigurationException, TransformerException, FileNotFoundException{
		
		//获取一个DOM无指定路径的对象
		Document document = getDocment();
/*创建根节点*/
		Element persons = document.createElement("persons");
		
/*创建一级子节点*/
		Element person0 = document.createElement("person");
		Element person1 = document.createElement("person");
		person0.setAttribute("id","0");
		person1.setAttribute("id","1");
		
/*创建二级子节点*/
		Element name0 = document.createElement("name");
		Element age0 = document.createElement("age");
		Element sex0 = document.createElement("sex");
		Element name1 = document.createElement("name");
		Element age1 = document.createElement("age");
		Element sex1 = document.createElement("sex");
		
/*将根目录加入到DOM对象*/
		document.appendChild(persons);
		
/*将一级节点加入到根目录*/
		persons.appendChild(person0);
		persons.appendChild(person1);
		
/*将三级级节点加入到二级节点*/
		person0.appendChild(name0);
		person0.appendChild(age0);
		person0.appendChild(sex0);
		person1.appendChild(name1);
		person1.appendChild(age1);
		person1.appendChild(sex1);
		
/*将信息加入三级节点*/
		name0.appendChild(document.createTextNode("至尊宝"));
		age0.appendChild(document.createTextNode("21"));
		sex0.appendChild(document.createTextNode("男"));
		name1.appendChild(document.createTextNode("白晶晶"));
		age1.appendChild(document.createTextNode("999"));
		sex1.appendChild(document.createTextNode("女"));
		
/*写入存储*/
		//获取写入工具
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		//拿到内存里面的数据
		DOMSource domSource = new DOMSource(document);
		//设置编码
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
		//将内存中的数据写出
		transformer.transform(domSource, new StreamResult(new PrintWriter(new FileOutputStream(file))));
	}


}
 类似资料: