
commons.box.util.XMLs Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of commons-box-app Show documentation
Show all versions of commons-box-app Show documentation
Common utils for BOX projects.
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