2019独角兽企业重金招聘Python工程师标准>>>

这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你定义好了xml的模板,就能一键生成java代码。省下了自己再使用工具类写代码的时间,极大得提高了效率。

开源oschina的git地址:https://git.oschina.net/lv-success/createXml.git
        喜欢就点个赞哈。。。。

首先来看看工具类代码

package com.lfq.createXml;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;/*** 操作xml文件以及生成java代码的工具* @author lfq* @since 1.0, Jun 12, 2007*/
public final class XmlUtils {private static final String XMLNS_XSI = "xmlns:xsi";private static final String XSI_SCHEMA_LOCATION = "xsi:schemaLocation";private static final String LOGIC_YES = "yes";private static final String DEFAULT_ENCODE = "UTF-8";private static final String REG_INVALID_CHARS = "&#\\d+;";/*** Creates a new document instance.** @return a new document instance* @throws XmlException problem creating a new document*/public static Document newDocument() throws XmlException {Document doc = null;try {doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();} catch (ParserConfigurationException e) {throw new XmlException(e);}return doc;}/*** Parses the content of the given XML file as an XML document.** @param file the XML file instance* @return the document instance representing the entire XML document* @throws XmlException problem parsing the XML file*/public static Document getDocument(File file) throws XmlException {InputStream in = getInputStream(file);return getDocument(in);}/*** Parses the content of the given stream as an XML document.** @param in the XML file input stream* @return the document instance representing the entire XML document* @throws XmlException problem parsing the XML input stream*/public static Document getDocument(InputStream in) throws XmlException {Document doc = null;try {DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();doc = builder.parse(in);} catch (ParserConfigurationException e) {throw new XmlException(e);} catch (SAXException e) {throw new XmlException(XmlException.XML_PARSE_ERROR, e);} catch (IOException e) {throw new XmlException(XmlException.XML_READ_ERROR, e);} finally {if (in != null) {try {in.close();} catch (IOException e) {// nothing to do}}}return doc;}/*** Creates a root element as well as a new document with specific tag name.** @param tagName the name of the root element* @return a new element instance* @throws XmlException problem generating a new document*/public static Element createRootElement(String tagName) throws XmlException {Document doc = newDocument();Element root = doc.createElement(tagName);doc.appendChild(root);return root;}/*** Gets the root element from input stream.** @param in the XML file input stream* @return the root element of parsed document* @throws XmlException problem parsing the XML file input stream*/public static Element getRootElementFromStream(InputStream in)throws XmlException {return getDocument(in).getDocumentElement();}/*** Gets the root element from given XML file.** @param fileName the name of the XML file* @return the root element of parsed document* @throws XmlException problem parsing the XML file*/public static Element getRootElementFromFile(File file)throws XmlException {return getDocument(file).getDocumentElement();}/*** Gets the root element from the given XML payload.** @param payload the XML payload representing the XML file.* @return the root element of parsed document* @throws XmlException problem parsing the XML payload*/public static Element getRootElementFromString(String payload)throws XmlException {if (payload == null || payload.trim().length() < 1) {throw new XmlException(XmlException.XML_PAYLOAD_EMPTY);}byte[] bytes = null;try {bytes = payload.getBytes(DEFAULT_ENCODE);} catch (UnsupportedEncodingException e) {throw new XmlException(XmlException.XML_ENCODE_ERROR, e);}InputStream in = new ByteArrayInputStream(bytes);return getDocument(in).getDocumentElement();}/*** Gets the descendant elements list from the parent element.** @param parent the parent element in the element tree* @param tagName the specified tag name* @return the NOT NULL descendant elements list*/public static List<Element> getElements(Element parent, String tagName) {NodeList nodes = parent.getElementsByTagName(tagName);List<Element> elements = new ArrayList<Element>();for (int i = 0; i < nodes.getLength(); i++) {Node node = nodes.item(i);if (node instanceof Element) {elements.add((Element) node);}}return elements;}/*** Gets the immediately descendant element from the parent element.** @param parent the parent element in the element tree* @param tagName the specified tag name.* @return immediately descendant element of parent element, NULL otherwise.*/public static Element getElement(Element parent, String tagName) {List<Element> children = getElements(parent, tagName);if (children.isEmpty()) {return null;} else {return children.get(0);}}/*** Gets the immediately child elements list from the parent element.** @param parent the parent element in the element tree* @param tagName the specified tag name* @return the NOT NULL immediately child elements list*/public static List<Element> getChildElements(Element parent, String tagName) {NodeList nodes = parent.getElementsByTagName(tagName);List<Element> elements = new ArrayList<Element>();for (int i = 0; i < nodes.getLength(); i++) {Node node = nodes.item(i);if (node instanceof Element && node.getParentNode() == parent) {elements.add((Element) node);}}return elements;}/*** Gets the immediately child element from the parent element.** @param parent the parent element in the element tree* @param tagName the specified tag name* @return immediately child element of parent element, NULL otherwise*/public static Element getChildElement(Element parent, String tagName) {List<Element> children = getChildElements(parent, tagName);if (children.isEmpty()) {return null;} else {return children.get(0);}}/*** Gets the value of the child element by tag name under the given parent* element. If there is more than one child element, return the value of the* first one.** @param parent the parent element* @param tagName the tag name of the child element* @return value of the first child element, NULL if tag not exists*/public static String getElementValue(Element parent, String tagName) {String value = null;Element element = getElement(parent, tagName);if (element != null) {value = element.getTextContent();}return value;}/*** Appends the child element to the parent element.** @param parent the parent element* @param tagName the child element name* @return the child element added to the parent element*/public static Element appendElement(Element parent, String tagName) {Element child = parent.getOwnerDocument().createElement(tagName);parent.appendChild(child);return child;}/*** Appends the child element as well as value to the parent element.** @param parent the parent element* @param tagName the child element name* @param value the child element value* @return the child element added to the parent element*/public static Element appendElement(Element parent, String tagName,String value) {Element child = appendElement(parent, tagName);child.setTextContent(value);return child;}/*** Appends another element as a child element.** @param parent the parent element* @param child the child element to append*/public static void appendElement(Element parent, Element child) {Node tmp = parent.getOwnerDocument().importNode(child, true);parent.appendChild(tmp);}/*** Appends the CDATA element to the parent element.** @param parent the parent element* @param tagName the CDATA element name* @param value the CDATA element value* @return the CDATA element added to the parent element*/public static Element appendCDATAElement(Element parent, String tagName,String value) {Element child = appendElement(parent, tagName);if (value == null) { // avoid "null" word in the XML payloadvalue = "";}Node cdata = child.getOwnerDocument().createCDATASection(value);child.appendChild(cdata);return child;}/*** Converts the Node/Element instance to XML payload.** @param node the node/element instance to convert* @return the XML payload representing the node/element* @throws XmlException problem converting XML to string*/public static String childNodeToString(Node node) throws XmlException {String payload = null;try {Transformer tf = TransformerFactory.newInstance().newTransformer();Properties props = tf.getOutputProperties();props.setProperty(OutputKeys.OMIT_XML_DECLARATION, LOGIC_YES);tf.setOutputProperties(props);StringWriter writer = new StringWriter();tf.transform(new DOMSource(node), new StreamResult(writer));payload = writer.toString();payload = payload.replaceAll(REG_INVALID_CHARS, " ");} catch (TransformerException e) {throw new XmlException(XmlException.XML_TRANSFORM_ERROR, e);}return payload;}/*** Converts the Node/Document/Element instance to XML payload.** @param node the node/document/element instance to convert* @return the XML payload representing the node/document/element* @throws XmlException problem converting XML to string*/public static String nodeToString(Node node) throws XmlException {String payload = null;try {Transformer tf = TransformerFactory.newInstance().newTransformer();Properties props = tf.getOutputProperties();props.setProperty(OutputKeys.INDENT, LOGIC_YES);props.setProperty(OutputKeys.ENCODING, DEFAULT_ENCODE);tf.setOutputProperties(props);StringWriter writer = new StringWriter();tf.transform(new DOMSource(node), new StreamResult(writer));payload = writer.toString();payload = payload.replaceAll(REG_INVALID_CHARS, " ");} catch (TransformerException e) {throw new XmlException(XmlException.XML_TRANSFORM_ERROR, e);}return payload;}/*** Converts the an XML file to XML payload.** @param file the XML file instance* @return the XML payload representing the XML file* @throws XmlException problem transforming XML to string*/public static String xmlToString(File file) throws XmlException {Element root = getRootElementFromFile(file);return nodeToString(root);}/*** Converts the an XML file input stream to XML payload.** @param in the XML file input stream* @return the payload represents the XML file* @throws XmlException problem transforming XML to string*/public static String xmlToString(InputStream in) throws XmlException {Element root = getRootElementFromStream(in);return nodeToString(root);}/*** Saves the node/document/element as XML file.** @param doc the XML node/document/element to save* @param file the XML file to save* @throws XmlException problem persisting XML file*/public static void saveToXml(Node doc, File file) throws XmlException {OutputStream out = null;try {Transformer tf = TransformerFactory.newInstance().newTransformer();Properties props = tf.getOutputProperties();props.setProperty(OutputKeys.METHOD, XMLConstants.XML_NS_PREFIX);props.setProperty(OutputKeys.INDENT, LOGIC_YES);tf.setOutputProperties(props);DOMSource dom = new DOMSource(doc);out = getOutputStream(file);Result result = new StreamResult(out);tf.transform(dom, result);} catch (TransformerException e) {throw new XmlException(XmlException.XML_TRANSFORM_ERROR, e);} finally {if (out != null) {try {out.close();} catch (IOException e) {// nothing to do}}}}/*** Validates the element tree context via given XML schema file.** @param doc the XML document to validate* @param schemaFile the XML schema file instance* @throws XmlException error occurs if the schema file not exists*/public static void validateXml(Node doc, File schemaFile)throws XmlException {validateXml(doc, getInputStream(schemaFile));}/*** Validates the element tree context via given XML schema file.** @param doc the XML document to validate* @param schemaStream the XML schema file input stream* @throws XmlException error occurs if validation fail*/public static void validateXml(Node doc, InputStream schemaStream)throws XmlException {try {Source source = new StreamSource(schemaStream);Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(source);Validator validator = schema.newValidator();validator.validate(new DOMSource(doc));} catch (SAXException e) {throw new XmlException(XmlException.XML_VALIDATE_ERROR, e);} catch (IOException e) {throw new XmlException(XmlException.XML_READ_ERROR, e);} finally {if (schemaStream != null) {try {schemaStream.close();} catch (IOException e) {// nothing to do}}}}/*** Transforms the XML content to XHTML/HTML format string with the XSL.** @param payload the XML payload to convert* @param xsltFile the XML stylesheet file* @return the transformed XHTML/HTML format string* @throws XmlException problem converting XML to HTML*/public static String xmlToHtml(String payload, File xsltFile)throws XmlException {String result = null;try {Source template = new StreamSource(xsltFile);Transformer transformer = TransformerFactory.newInstance().newTransformer(template);Properties props = transformer.getOutputProperties();props.setProperty(OutputKeys.OMIT_XML_DECLARATION, LOGIC_YES);transformer.setOutputProperties(props);StreamSource source = new StreamSource(new StringReader(payload));StreamResult sr = new StreamResult(new StringWriter());transformer.transform(source, sr);result = sr.getWriter().toString();} catch (TransformerException e) {throw new XmlException(XmlException.XML_TRANSFORM_ERROR, e);}return result;}/*** Sets the namespace to specific element.** @param element the element to set* @param namespace the namespace to set* @param schemaLocation the XML schema file location URI*/public static void setNamespace(Element element, String namespace,String schemaLocation) {element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,XMLConstants.XMLNS_ATTRIBUTE, namespace);element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLNS_XSI,XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);element.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI,XSI_SCHEMA_LOCATION, schemaLocation);}/*** Encode the XML payload to legality character.** @param payload the XML payload to encode* @return the encoded XML payload* @throws XmlException problem encoding the XML payload*/public static String encodeXml(String payload) throws XmlException {Element root = createRootElement(XMLConstants.XML_NS_PREFIX);root.setTextContent(payload);return childNodeToString(root.getFirstChild());}private static InputStream getInputStream(File file) throws XmlException {InputStream in = null;try {in = new FileInputStream(file);} catch (FileNotFoundException e) {throw new XmlException(XmlException.FILE_NOT_FOUND, e);}return in;}private static OutputStream getOutputStream(File file) throws XmlException {OutputStream in = null;try {in = new FileOutputStream(file);} catch (FileNotFoundException e) {throw new XmlException(XmlException.FILE_NOT_FOUND, e);}return in;}/*** @Desc 把实体类中有的字段直接转为xml节点* @author LV_FQ* @date 2016年12月15日* @param parent* @param formMap* @param fields*/public static void entityToXml(Element parent, String... fields){for(String field : fields){String temp = "XmlUtils.appendElement(root, \"" + field + "\", decHeadFormMap.getStr(\"field\"));";System.out.println(temp);XmlUtils.appendElement(parent, field, "取值");}}/*** @Desc 根据xml生成java代码* @author LV_FQ* @date 2016年12月16日* @param file xml文件*/public static void createJavaCode(File file){XMLToJavaUtils.createJavaCode(file);}
}class XmlException extends RuntimeException {private static final long serialVersionUID = 381260478228427716L;public static final String XML_PAYLOAD_EMPTY = "xml.payload.empty";public static final String XML_ENCODE_ERROR = "xml.encoding.invalid";public static final String FILE_NOT_FOUND = "xml.file.not.found";public static final String XML_PARSE_ERROR = "xml.parse.error";public static final String XML_READ_ERROR = "xml.read.error";public static final String XML_VALIDATE_ERROR = "xml.validate.error";public static final String XML_TRANSFORM_ERROR = "xml.transform.error";public XmlException() {super();}public XmlException(String key, Throwable cause) {super(key, cause);}public XmlException(String key) {super(key);}public XmlException(Throwable cause) {super(cause);}
}/*** @Desc 根据xml的格式生成xml的对应的java生成代码* @author LV_FQ* @date 2016年12月16日 下午2:08:38* @version 1.0**/
class XMLToJavaUtils {public static void createJavaCode(File file) {try {//File file = new File("C:/Users/SUCCESS/Desktop/temp.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(file);if (doc.hasChildNodes()) {printNote(doc.getChildNodes(), null);}} catch (Exception e) {e.printStackTrace();}}private static void printNote(NodeList nodeList, Node parent) {for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {if(parent == null){System.out.println("Element "+ getTagName(node.getNodeName())+" = XmlUtils.createRootElement(\""+ node.getNodeName() +"\");");}else{String temp = "XmlUtils.appendElement("+getTagName(parent == null? null : parent.getNodeName())+", \"" + node.getNodeName();if (node.hasChildNodes() && node.getChildNodes().getLength() > 1) {System.out.println();//非叶节点把节点的名称加上,以便子节点和父节点做关联temp = "Element " + getTagName(node.getNodeName()) + " = " + temp + "\");";}else{//叶节点把注释加上//temp += "\", \"value\");//" + node.getTextContent();temp += "\", \""+ node.getTextContent() +"\");";}System.out.println(temp);}if (node.hasChildNodes()) {printNote(node.getChildNodes(), node);}}}}/*** @Desc 把字符串第一个字母转小写* @author LV_FQ* @date 2016年12月16日* @param name* @return*/private static String getTagName(String name){if(StringUtils.isBlank(name)){return "";}String temp = name;temp = temp.substring(0, 1).toLowerCase() + temp.substring(1);return temp;}
}

测试方法

package com.lfq.createXml;import java.io.File;import org.w3c.dom.Element;public class TestXml {public static void main(String[] args) {Element note = XmlUtils.createRootElement("note");XmlUtils.appendElement(note, "to", "George1");XmlUtils.appendElement(note, "from", "John2");XmlUtils.appendElement(note, "heading", "Reminder1");XmlUtils.appendElement(note, "body", "Don't forget the meeting!");XmlUtils.saveToXml(note, new File("/home/lv-success/Desktop/temp.xml"));//使用xml生成工具生成java代码(控制台输出)File file = new File("/home/lv-success/Desktop/temp.xml");XmlUtils.createJavaCode(file);}}

从test中可以看出,工具类通过已有的操作xml文件的方法读取xml的结构,同时根据读取的节点内容直接把对于生成的方法打印到控制台中,如此嵌套打印,最终打印出这个xml文件的相同java层次结构的代码。

如果对生成的java代码有不同要求,大家可以直接修改工具类中的生成java代码的方法。能生成自己最终要求最接近的代码最好,怎么方便怎么来哈。

说明:其中操作xml的源代码不是我写的,引用的这位网友的代码,可以参考一下,我主要写了生成java代码的方法。参考的链接http://carver.iteye.com/blog/411611

转载于:https://my.oschina.net/u/3080373/blog/811685

xml与java代码相互装换的工具类相关推荐

  1. java word生成_JAVA生成WORD工具类

    该方法借助freemarker的JAR包即可. 参考: 所需工具: 步骤: 1.在word中编辑好模版样式,设置好占位符,注意图片最好先黏上去 2.在word中,文件-另存为-XML格式 3.使用工具 ...

  2. Java时间戳与日期格式转换工具类

    Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...

  3. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  4. Java学习总结:58(Collections工具类)

    Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...

  5. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  6. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  7. Java 图片添加数字暗水印工具类

    Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...

  8. java获取客户端的IP地址工具类

    java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...

  9. Java判断不为空的工具类总结

    Java判断不为空的工具类总结 1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. 1 package com.bie.util; 2 3 import jav ...

最新文章

  1. android进度指示器_等待的痛苦—浏览进度指示器地狱的7个级别
  2. python 多线程和协程结合_一文讲透 “进程、线程、协程”
  3. 谈谈Linux下的数据流重定向和管道命令
  4. Python的线程/进程间通讯对象分析
  5. C语言再学习 -- 文件
  6. IM推送保障及网络优化详解(二):如何做长连接加推送组合方案
  7. CodeForces - 670C Cinema(离散化+排序/map,水题)
  8. 我的特长是复制、粘帖
  9. java虚拟机10.内存模型与线程
  10. FreeRTOS任务优先级说明
  11. c语言合法常量e8,c语言合法常量定义
  12. Hutool:时间日期工具
  13. string字符串的高级用法
  14. 软件测试52讲-测试新技术篇
  15. git 遇到fatal:multiple stage entries for merged file
  16. [LeetCode] Best Time to Buy and Sell Stock
  17. 自动设置为兼容模式html5,详细教你将IE浏览器设置为兼容模式的设置方法
  18. 技术栈(technology stack)
  19. 案例:理想主义的猪与结果导向的猪
  20. 懒癌发作,福利直接发,不抢白不抢!

热门文章

  1. python库迁移到没有网的电脑_关于换机器后python库的迁移-偷懒做法
  2. Qt 设置窗口背景图片的几种方法
  3. 个人博客系统的设计与实现_一个 Go 开发的快速、简洁、美观、前后端分离的个人博客系统...
  4. 快速排名系统询火星推荐_搜狗网站快速排名系统 - 新站权重如何快速提升
  5. Python2和Python3除法差别
  6. linux 手动解压or增加or更新 jar 包中文件
  7. failed to open mysql_MySql使用全记录5 —–解决Windows下用命令导入sql文件时”Failed to open file”的问题 | 学步园...
  8. python语法错误常见原因_python3中open()的语法错误,不知道原因
  9. 分数四则运算_JAVA
  10. leetcode day5 -- Reorder List Linked List Cycle II