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包及其子包组成
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("执行结束!"); } }
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() + ">"); } }
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"); } }
XML系列:(5)XML解析-JAXP的DOM解析方式修改XML
原文:http://lsieun.blog.51cto.com/9210464/1773167