您的位置:首页 > 其它

XML系列:(5)XML解析-JAXP的DOM解析方式修改XML

2016-05-13 20:44 411 查看
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、思维导图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml dom jaxp