這是一個java操做xml文件的工具類,最大的亮點在於可以經過工具類直接生成xml一樣層次結構的java代碼,也就是說,只要你定義好了xml的模板,就能一鍵生成java代碼。省下了本身再使用工具類寫代碼的時間,極大得提升了效率。java
開源oschina的git地址:https://git.oschina.net/lv-success/createXml.git
喜歡就點個贊哈。。。。node
首先來看看工具類代碼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 payload value = ""; } 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; } }
測試方法apache
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層次結構的代碼。json
若是對生成的java代碼有不一樣要求,你們能夠直接修改工具類中的生成java代碼的方法。能生成本身最終要求最接近的代碼最好,怎麼方便怎麼來哈。app
說明:其中操做xml的源代碼不是我寫的,引用的這位網友的代碼,能夠參考一下,我主要寫了生成java代碼的方法。參考的連接http://carver.iteye.com/blog/411611dom