DOM、SAX和StAX只是解析方式,没有API。

JAXP是SUN提供的一套XML解析API。JAXP(Java API for XMLProcessing,意为XML处理的Java API)

JAXP很好的支持DOM和SAX解析。

JAXP开发包是JAVASE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成

1、以DOM解析方式修改XML


1.1、将Document树保存到文件中


package com.rk.xml.e_jaxp_dom_write;

import java.io.File;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

/**
 * 将Document树保存到文件中
 * @author RK
 *
 */
public class Demo01
{
	public static void main(String[] args) throws Exception
	{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document doc = builder.parse("./src/products.xml");
		
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(doc), new StreamResult(new File("D:/rk/abc.xml")));
		System.out.println("执行结束!");
	}
}



1.2、封装JAXP的工具类

package com.rk.utils;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import java.io.File;

import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class JAXPUtil
{
	public static Document openDocument(File file)
	{
		try
		{
			DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = builderFactory.newDocumentBuilder();
			Document doc = builder.parse(file);
			return doc;
		}
		catch (Exception e)
		{
			throw new RuntimeException(e);
		}
	}

	public static Document openDocument(String filePath)
	{
		return openDocument(new File(filePath));
	}

	public static void saveDocument(Document document, File file)
	{
		try
		{
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document), new StreamResult(file));
		}
		catch (Exception e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public static void saveDocument(Document document, String filePath)
	{
		saveDocument(document, new File(filePath));
	}
	
	public static void traverseDocument(Node node, StringBuilder sb)
	{
		//1、当前元素开始
		sb.append("<" + node.getNodeName() + " ");
		//2、获取属性
		
		if(node.hasAttributes())
		{
			NamedNodeMap nodeMap = node.getAttributes();
			for(int i=0;i<nodeMap.getLength();i++)
			{
				Node attrNode = nodeMap.item(i);
				sb.append(attrNode.getNodeName() + "=\"" + attrNode.getNodeValue() + "\" ");
			}
		}
		sb.append(">");
		
		//3、获取子节点
		NodeList childNodes = node.getChildNodes();
		for(int i=0;i<childNodes.getLength();i++)
		{
			Node subNode = childNodes.item(i);
			short type = subNode.getNodeType();
			if(type == 1)//当前节点是Element节点
			{
				traverseDocument(subNode, sb);
			}
			else if(type == 3)//当前节点是Text节点
			{
				sb.append(subNode.getTextContent());
			}
			else
			{
				//其它情况,不做处理
			}
		}
		
		//4、当前元素结束
		sb.append("</" + node.getNodeName() + ">");
	}
}



1.3、通过JAXP进行Document对象树的修改


package com.rk.xml.e_jaxp_dom_write;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.Attr;
import org.w3c.dom.Text;

import com.rk.utils.JAXPUtil;

/**
 * 通过JAXP进行Document对象树的修改:
 * 元素:添加、删除
 * 属性:添加、修改、删除
 * 文本:添加、修改
 * @author RK
 *
 */
public class Demo02
{
	public static void main(String[] args)
	{
		Document doc = JAXPUtil.openDocument("./src/products.xml");
		
		Node rootNode = doc.getLastChild();
		//元素操作:添加、删除
		Element newProduct = doc.createElement("product");//创建新的Elements节点
		rootNode.appendChild(newProduct);//添加
		Node subNode = doc.getElementById("p001");
		rootNode.removeChild(subNode);//删除
		
		
		//属性操作:添加、删除、修改
		Attr newId = doc.createAttribute("id");//创建Attribute节点
		newId.setNodeValue("p003");//设置Attribute节点的值
		newProduct.setAttributeNode(newId);//添加
		newProduct.removeAttribute("id");//删除
		newProduct.setAttribute("id", "p004");//修改
		
		//文本操作:添加、修改
		Element nameElem = doc.createElement("name");
		Text nameText = doc.createTextNode("最后的贵族");//创建Text节点
		nameElem.appendChild(nameText);//添加
		Element priceElem = doc.createElement("price");		
		priceElem.setTextContent("49.99元");//修改
		newProduct.appendChild(nameElem);
		newProduct.appendChild(priceElem);
		
		//遍历Document树,打印结果
		StringBuilder sb = new StringBuilder();
		JAXPUtil.traverseDocument(rootNode, sb);
		System.out.println(sb.toString());
		
		//将新生成的Document树输出到指定文件
		JAXPUtil.saveDocument(doc, "D:/rk/result.xml");
	}
}





2、思维导图

wKioL1c1yi6BT_l9AAF49VEDzyg283.png