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包及其子包组成
![](http://s5.51cto.com/wyfs02/M01/80/0E/wKioL1c1yi6BT_l9AAF49VEDzyg283.png)
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、思维导图
![](http://s5.51cto.com/wyfs02/M01/80/0E/wKioL1c1yi6BT_l9AAF49VEDzyg283.png)
相关文章推荐
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- Mootools 1.2教程(2) DOM选择器
- DOM 事件流详解
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- Dom在ajax技术中的作用说明
- 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
- Ruby中XML格式数据处理库REXML的使用方法指南
- C#针对xml基本操作及保存配置文件应用实例
- Ruby使用REXML库来解析xml格式数据的方法
- Ruby程序中创建和解析XML文件的方法
- Ruby的XML格式数据解析库Nokogiri的使用进阶
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总