All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commons.box.util.XMLs Maven / Gradle / Ivy

The newest version!
package commons.box.util;

import commons.box.app.AppError;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import javax.xml.bind.*;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 

创建作者:xingxiuyi

*

版权所属:xingxiuyi

*/ public final class XMLs { private static final Map EMPTY_HEADERS = Maps.immmap(new LinkedHashMap<>()); private static final DocumentBuilderFactory XML_DOCUMENT_BUILDER_FACT = DocumentBuilderFactory.newInstance(); private static Map JAXB_CONTEXT = new ConcurrentHashMap<>(); private XMLs() { } public static Document from(String xml) { return from(new ByteArrayInputStream(xml.getBytes(Langs.CHARSET_UTF8)), Langs.UTF8); } public static Document from(InputStream in, String encoding) { DocumentBuilder builder = null; Document ret = null; try { builder = XML_DOCUMENT_BUILDER_FACT.newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new AppError("XML 解析器构建存在错误 - ", e); } try { InputSource is = new InputSource(in); is.setEncoding(encoding); ret = builder.parse(is); } catch (Exception e) { throw new AppError("XML 解析错误 - " + e.getMessage(), e); } return ret; } /** * 选择所有的节点 返回的列表按照文档顺序来组织 * * @param path * @param node * @param namespaces 命名空间 * @return */ /* @SuppressWarnings("unchecked") public static List selectNodes(String path, Object node, Map namespaces) { try { return getDOMXPath(path, namespaces).selectNodes(node); } catch (Exception e) { throw new RuntimeException(e); } } */ /** * 列出所有的节点 返回的列表按照文档顺序来组织 * * @param path * @param node * @return */ /* public static List selectNodes(String path, Object node) { return selectNodes(path, node, null); } public static Node selectNode(String path, Object node, Map namespaces) { try { List nodes = selectNodes(path, node, namespaces); if (nodes.size() == 0) { return null; } return nodes.doGet(0); } catch (Exception e) { throw new RuntimeException(e); } } public static Node selectNode(String path, Object node) { return selectNode(path, node, null); } */ /** * 返回节点的内容或者属性的值 * * @param path 解析路径 * @param node 可以是节点node或者其他内容对象 */ /* public static String selectText(String path, Object node, Map namespaces) { try { Node rnode = (Node) getDOMXPath(path, namespaces).selectSingleNode(node); if (rnode == null) { return null; } if (!(rnode instanceof Text)) { rnode = rnode.getFirstChild(); } if (!(rnode instanceof Text)) { return null; } return ((Text) rnode).getData(); } catch (Exception e) { throw new RuntimeException(e); } } */ /** * 返回节点的内容或者属性的值 * * @param path 解析路径 * @param node 可以是节点node或者其他内容对象 */ /* public static String selectText(String path, Object node) { return selectText(path, node, null); } private static DOMXPath getDOMXPath(String path, Map namespaces) throws Exception { DOMXPath xpath = new DOMXPath(path); if (namespaces != null) { for (String prefix : namespaces.keySet()) { xpath.addNamespace(prefix, namespaces.doGet(prefix)); } } return xpath; } */ /** * 值对象转换为XML * * @param root * @return */ public static String toXml(Object root) { Class clazz = getUserClass(root); return toXml(root, clazz, null); } /** * 值对象转换为XML 根据对象判断所属类 * * @param root * @param encoding * @return */ public static String toXml(Object root, String encoding) { Class clazz = getUserClass(root); return toXml(root, clazz, encoding); } /** * 值对象转换为XML * * @param root * @param clazz * @param encoding * @return */ public static String toXml(Object root, Class clazz, String encoding) { try { StringWriter writer = new StringWriter(); createMarshaller(clazz, encoding).marshal(root, writer); return writer.toString(); } catch (JAXBException e) { throw unchecked(e); } } /** * 集合转换为XML * * @param root * @param rootName * @param clazz * @return */ public static String toXml(Collection root, String rootName, Class clazz) { return toXml(root, rootName, clazz, null); } /** * 集合转换为XML * * @param root * @param rootName * @param clazz * @param encoding * @return */ public static String toXml(Collection root, String rootName, Class clazz, String encoding) { try { CollectionWrapper wrapper = new CollectionWrapper(); wrapper.collection = root; JAXBElement wrapperElement = new JAXBElement(new QName(rootName), CollectionWrapper.class, wrapper); StringWriter writer = new StringWriter(); createMarshaller(clazz, encoding).marshal(wrapperElement, writer); return writer.toString(); } catch (JAXBException e) { throw unchecked(e); } } /** * Xml转换为Java 对象 */ @SuppressWarnings("unchecked") public static T fromXml(String xml, Class clazz) { try { StringReader reader = new StringReader(xml); return (T) createUnmarshaller(clazz).unmarshal(reader); } catch (JAXBException e) { throw unchecked(e); } } /** * 创建Marshaller并设定encoding(可为null). * 线程不安全,需要每次创建或pooling。 */ public static Marshaller createMarshaller(Class clazz, String encoding) { try { JAXBContext jaxbContext = getJaxbContext(clazz); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); if (Strs.isNotBlank(encoding)) { marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); } return marshaller; } catch (JAXBException e) { throw unchecked(e); } } /** * 创建UnMarshaller. * 线程不安全,需要每次创建或pooling。 */ public static Unmarshaller createUnmarshaller(Class clazz) { try { JAXBContext jaxbContext = getJaxbContext(clazz); return jaxbContext.createUnmarshaller(); } catch (JAXBException e) { throw unchecked(e); } } protected static JAXBContext getJaxbContext(Class clazz) { if (clazz == null) clazz = Object.class; String cname = clazz.getName(); JAXBContext jaxbContext = JAXB_CONTEXT.get(cname); if (jaxbContext == null) { try { jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class); JAXB_CONTEXT.putIfAbsent(cname, jaxbContext); } catch (JAXBException ex) { throw AppError.error("Could not instantiate JAXBContext for class [" + clazz + "]: " + ex.getMessage(), ex); } } return jaxbContext; } /** * 封装Root Element 是 Collection的情况. */ public static class CollectionWrapper { @XmlAnyElement protected Collection collection; } private static RuntimeException unchecked(Exception e) { return new RuntimeException(e); } public static Class getUserClass(Object instance) { Class clazz = instance.getClass(); if (clazz != null && clazz.getName().contains("$$")) { Class superClass = clazz.getSuperclass(); if (superClass != null && !Object.class.equals(superClass)) return superClass; } return clazz; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy