java|java 如何使用org.w3c.dom操作XML文件
本篇介绍在java中,如何使用org.w3c.dom中的相关内容来操作XML文件。包括:
- 如何在内存中构建XML文件并写入磁盘;
- 如何从磁盘读取XML文件到内存;
- 如何添加注释,读取注释;
- 如何添加属性,读取属性;
- 如何添加子元素,读取子元素;
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.TransformerConfigurationException; 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.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.Set; public class XMLSample{ private static void writeXML(Document document, String filePath) { TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = null; try {String parent = new File(filePath).getParent(); File pDir = new File(parent); if (!pDir.exists()) {pDir.mkdirs(); }OutputStream os = new FileOutputStream(new File(filePath)); transformer = transFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); DOMSource source = new DOMSource(); source.setNode(document); StreamResult result = new StreamResult(); result.setOutputStream(os); transformer.transform(source, result); os.flush(); } catch (TransformerConfigurationException e) {e.printStackTrace(); } catch (TransformerException e) {e.printStackTrace(); } catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); } } private static Document readXML(String file) { try {// 得到DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); // 从DOM工厂中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); // 把要解析的xml文档读入DOM解析器Document doc = dbBuilder.parse(file); return doc; } catch (Exception e) {e.printStackTrace(); }return null; } public static void showXMLDetail() { Document document = readXML(mapperFilePath); // 获取标签名为"dataset"的元素Node mapper = document.getElementsByTagName("dataset").item(0); // 下面依次读取dataset元素的每个子元素,每个子元素的标签名字为nodefor (int i = 0; i < mapper.getChildNodes().getLength(); i++) {Node node = mapper.getChildNodes().item(i); String s = item.getNodeName(); if(s.toLowerCase().equals("#comment")){System.out.println("这是注释内容: "+node.getTextContent()); }else if(s.toLowerCase().equals("#text")){System.out.println("呐,这是标签之外的文本: "+node.getTextContent()); }else if ("node".equals(s)) {// 获取元素属性的值String column = item.getAttributes().getNamedItem("column").getNodeValue(); String field = item.getAttributes().getNamedItem("property").getNodeValue(); }else{// 其他的就不要了} } } public static void generateXML(){try {Element root; Set set = new HashSet<>(); set.add("node"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder documentBuilder = null; documentBuilder = factory.newDocumentBuilder(); Document document = documentBuilder.newDocument(); root = document.createElement("dataset"); document.appendChild(root); set.forEach(p -> {Element element = document.createElement(p); element.setAttribte("column","haha"); element.setAttribte("property","heihei"); root.appendChild(element); }); writeXML(document, "d:/allTables.xml"); } catch (ParserConfigurationException e) {e.printStackTrace(); } }}
Java操作XML(使用org.w3c.dom)
一、创建DOM
XMLBuilder.java 用于创建DOM,Root结点 /******************************************************************** * 项目名称:rochoc * 包名称:rochoc.xml.oper * 文件名称:XmlBuilder * 编写者:luoc * 编写日期:2005-6-22 * 程序功能(类)描述 : 根据传入的XML文件生成Document和root结点 * * 程序变更日期: * 变更作者: * 变更说明:********************************************************************/package rochoc.xml.oper; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; /** * 类名:XmlBuilder * 类描述:根据传入的XML文件生成Document和root结点 * 编写者 :luoc * 编写日期 :2005-6-22 * 主要public成员变量: * 主要public方法: **/ public class XmlBuilder{/***构造函数说明:*参数说明:@param path**/public XmlBuilder(String path){this.path=path; init(); }/*** 方法名称:init* 方法功能:初始化函数* 参数说明: * 返回:void * 作者:luoc* 日期:2005-6-22**/public void init(){buildDocument(); buildRoot(); }/*** 方法名称:buildDocument* 方法功能:将XML文件生成Document * 参数说明: * 返回:void * 作者:luoc* 日期:2005-6-22**/private void buildDocument(){DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); try{DocumentBuilder builder=factory.newDocumentBuilder(); logger.debug("Construct document builder success."); doc=builder.parse(new File(path)); logger.debug("Build xml document success."); }catch(ParserConfigurationException e){logger.error("Construct document builder error:"+e); }catch(SAXException e){logger.error("Parse xml file error:"+e); }catch(IOException e){logger.error("Read xml file error:"+e); }}/*** 方法名称:buildRoot* 方法功能:生成XML的根结点* 参数说明: * 返回:void * 作者:luoc* 日期:2005-6-22**/private void buildRoot(){root=doc.getDocumentElement(); }/*** @return 返回 doc。*/public Document getDoc(){return doc; }/*** @param doc 要设置的 doc。*/public void setDoc(Document doc){this.doc = doc; }/*** @return 返回 path。*/public String getPath(){return path; }/*** @param path 要设置的 path。*/public void setPath(String path){this.path = path; }/*** @return 返回 root。*/public Element getRoot(){return root; }/*** @param root 要设置的 root。*/public void setRoot(Element root){this.root = root; }/*全局变量*/private String path=null; //xml文件路径private Document doc=null; //xml文件对应的documentprivate Element root=null; //xml文件的根结点private Logger logger=Logger.getLogger(getClass().getName()); }
二、查找,插入,删除,修改
XmlOper.java 用于操作XML文件,包括查找、新增、删除、修改结点 /******************************************************************** * 项目名称:rochoc * 包名称:rochoc.xml.oper * 文件名称:XmlOper * 编写者:luoc * 编写日期:2005-6-22 * 程序功能(类)描述 : 对XML进行读写操作 * * 程序变更日期: * 变更作者: * 变更说明:********************************************************************/package rochoc.xml.oper; import java.util.ArrayList; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * 类名:XmlOper * 类描述:对XML文件进行读写操作,均为静态函数 * 编写者 :luoc * 编写日期 :2005-6-22 * 主要public成员变量: * 主要public方法: **/ public class XmlOper{/***构造函数说明:*参数说明:**/private XmlOper(){}/*** 方法名称:getNodeList* 方法功能:获取父结点parent的所有子结点* 参数说明:@param parent* 参数说明:@return * 返回:NodeList * 作者:luoc* 日期:2005-6-22**/public static NodeList getNodeList(Element parent){return parent.getChildNodes(); }/*** 方法名称:getElementsByName* 方法功能:在父结点中查询指定名称的结点集* 参数说明:@param parent* 参数说明:@param name* 参数说明:@return * 返回:Element[] * 作者:luoc* 日期:2005-6-22**/public static Element [] getElementsByName(Element parent,String name){ArrayList resList=new ArrayList(); NodeList nl=getNodeList(parent); for(int i=0; i
三、新建XML文件XmlCreater.java 用于创建XML文件 /******************************************************************** * 项目名称:rochoc * 包名称:rochoc.xml.oper * 文件名称:XmlCreater * 编写者:luoc * 编写日期:2005-6-22 * 程序功能(类)描述 : 创建DOM并生成XML文件 * * 程序变更日期: * 变更作者: * 变更说明:********************************************************************/package rochoc.xml.oper; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * 类名:XmlCreater * 类描述: 创建DOM并生成XML文件 * 编写者 :luoc * 编写日期 :2005-6-22 * 主要public成员变量: * 主要public方法: **/ public class XmlCreater{/***构造函数说明:*参数说明:@param pathxml文件路径 **/public XmlCreater(String path){this.path=path; init(); }/*** 方法名称:init* 方法功能: 初始化函数* 参数说明: * 返回:void * 作者:luoc* 日期:2005-6-22**/private void init(){DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); try{DocumentBuilder builder=factory.newDocumentBuilder(); doc=builder.newDocument(); //新建DOM}catch(ParserConfigurationException e){logger.error("Parse DOM builder error:"+e); }}/*** 方法名称:createRootElement* 方法功能:创建根结点,并返回* 参数说明:@param rootTagName * 返回:Element * 作者:luoc* 日期:2005-6-22**/public Element createRootElement(String rootTagName){if(doc.getDocumentElement()==null){logger.debug("create root element '"+rootTagName+"' success."); Element root=doc.createElement(rootTagName); doc.appendChild(root); return root; }logger.warn("this dom's root element is exist,create fail."); return doc.getDocumentElement(); }/*** 方法名称:createElement* 方法功能:在parent结点下增加子结点tagName* 参数说明:@param parent* 参数说明:@param tagName * 返回:Element * 作者:luoc* 日期:2005-6-22**/public Element createElement(Element parent,String tagName){Document doc=parent.getOwnerDocument(); Element child=doc.createElement(tagName); parent.appendChild(child); return child; }/*** 方法名称:createElement* 方法功能:在parent结点下增加值为value的子结点tabName* 参数说明:@param parent* 参数说明:@param tagName* 参数说明:@param value * 返回:Element * 作者:luoc* 日期:2005-6-22**/public Element createElement(Element parent,String tagName,String value){Document doc=parent.getOwnerDocument(); Element child=doc.createElement(tagName); XmlOper.setElementValue(child,value); parent.appendChild(child); return child; }/*** 方法名称:createAttribute* 方法功能:在parent结点下增加属性 * 参数说明:@param parent* 参数说明:@param attrName 属性名* 参数说明:@param attrValue 属性值* 返回:void * 作者:luoc* 日期:2005-6-22**/public void createAttribute(Element parent,String attrName,String attrValue){XmlOper.setElementAttr(parent,attrName,attrValue); }/*** 方法名称:buildXmlFile* 方法功能:根据DOM生成XML文件* 参数说明: * 返回:void * 作者:luoc* 日期:2005-6-22**/public void buildXmlFile(){TransformerFactory tfactory=TransformerFactory.newInstance(); try{Transformer transformer=tfactory.newTransformer(); DOMSource source=new DOMSource(doc); logger.debug("New DOMSource success."); StreamResult result=new StreamResult(new File(path)); logger.debug("New StreamResult success."); transformer.setOutputProperty("encoding","GBK"); transformer.transform(source,result); logger.debug("Build XML File '"+path+"' success."); }catch(TransformerConfigurationException e){logger.error("Create Transformer error:"+e); }catch(TransformerException e){logger.error("Transformer XML file error:"+e); }}/*** @return 返回 doc。*/public Document getDoc(){return doc; }/*** @param doc 要设置的 doc。*/public void setDoc(Document doc){this.doc = doc; }/*** @return 返回 path。*/public String getPath(){return path; }/*** @param path 要设置的 path。*/public void setPath(String path){this.path = path; }/*全局变量*/private Logger logger = Logger.getLogger(getClass().getName()); private Document doc=null; //新创建的DOMprivate String path=null; //生成的XML文件绝对路径}
【java|java 如何使用org.w3c.dom操作XML文件】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 如何寻找情感问答App的分析切入点
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解