Dom4j example

1. maven dependency

              <dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>

2. code 

package test;


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;


import javax.xml.datatype.DatatypeFactory;


import org.apache.commons.lang3.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;


public class XmlReportReader {
private File xmlFile;
private Object data;
private DatatypeFactory factory;
private static final Map<String, Class<?>> instanceMap;

static {
Map<String, Class<?>> map = Maps.newHashMap();
registerBean(map, SheetXMLBean.class);
instanceMap = Collections.unmodifiableMap(map);
}


private static void registerBean(Map<String, Class<?>> map, Class<?>... classes) {
for (Class<?> clazz : classes) {
String name = clazz.getAnnotation(XmlName.class).name();
map.put(name, clazz);
}
}


public ICG14QXmlReportReader(File xmlFile, Object data) throws Exception {
this.xmlFile = xmlFile;
this.data = data;
factory = DatatypeFactory.newInstance();
}


public void readXml() throws Exception {
try (InputStream in = new FileInputStream(xmlFile);) {
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(in);


read(doc.getRootElement(), data);
}


}


private void read(Element element, Object data) throws Exception {
for (Object obj : element.attributes()) {
if (obj instanceof Attribute) {
setObject(data, ((Attribute) obj).getName(), ((Attribute) obj).getValue());
}
}

Set<String> nameSet = Sets.newHashSet(); 
for (Object obj : element.elements()) {
if (obj instanceof Element) {
nameSet.add(((Element) obj).getName());
}
}

for (String elementName : nameSet) {
List<?> elementList = element.elements(elementName);
List<Object> list = Lists.newArrayList();
for (Object obj : elementList) {
if (obj instanceof Element) {
Element ele = (Element)obj;
String text = ele.getTextTrim();
String name = ele.getName();
if (StringUtils.isEmpty(text)) {
Class<?> clazz = instanceMap.get(name);
Object instance = clazz.newInstance();
read(ele, instance);
list.add(instance);
} else {
setObject(data, name, text);
}
}
}

if (list.size() == 1) {
setObject(data, elementName, list.get(0));
} else if (list.size() > 1) {
setObject(data, elementName, list);
}
}

}


private void setObject(Object obj, String name, Object value) throws Exception {
Class<?> clazz = obj.getClass();
Map<String, Method> map = SheetXMLUtil.getWriterMap(clazz);


Method method = map.get(name);
if (method == null) {
throw new RuntimeException(name + " not found in Class " + clazz.getName());
} else {
Class<?> type = method.getParameters()[0].getType();
if (type.equals(String.class)) {
method.invoke(obj, value.toString());
} else if (type.equals(Integer.class) || type.equals(int.class)) {
method.invoke(obj, Integer.valueOf(value.toString()));
} else if (type.equals(BigDecimal.class)) {
method.invoke(obj, new BigDecimal(value.toString()));
} else if (type.equals(Date.class)) {
method.invoke(obj, factory.newXMLGregorianCalendar(value.toString()).toGregorianCalendar().getTime());
} else if (type.equals(List.class)) {
if (value instanceof List) {
method.invoke(obj, value);
} else {
method.invoke(obj, Arrays.asList(value));
}
} else {
throw new RuntimeException("unsupported type :" + type.getName());
}


}
}


}



package test;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;


import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


import test.util.SheetXMLUtil;
import test.util.XmlName;


public class XmlReportGenerator {
private static final BigDecimal DIVISOR_PERCENTAGE = new BigDecimal(100);
private File xsdFile;
private File outputFile;
private Object data;
private Element xsdRoot;


public XmlReportGenerator(File xsdFile, File outputFile, Object data) throws Exception {
this.xsdFile = xsdFile;
this.outputFile = outputFile;
this.data = data;
}


public void generateXml() throws Exception {
OutputFormat format = OutputFormat.createPrettyPrint();
try (InputStream in = new FileInputStream(xsdFile); FileOutputStream output = new FileOutputStream(outputFile);) {
SAXReader saxReader = new SAXReader();
Document xsdDoc = saxReader.read(in);
xsdRoot = xsdDoc.getRootElement();


Document outputDoc = DocumentHelper.createDocument();
String name = data.getClass().getAnnotation(XmlName.class).name();
Element outputRoot = outputDoc.addElement(name);
Element xsdElement = findElement(xsdRoot, name).element("complexType");
processObject(xsdElement, outputRoot, data);
XMLWriter writer = new XMLWriter(output, format);


writer.write(outputDoc);
}


}


private void processObject(Element xsdElement, Element outputElement, Object data) throws Exception {
if (data instanceof List) {
for (Object obj : (List<?>) data) {
processOneObject(xsdElement, outputElement, obj);
}
} else {
processOneObject(xsdElement, outputElement, data);
}
}


private void processOneObject(Element xsdElement, Element outputElement, Object data) throws Exception {
for (Object obj : xsdElement.elements()) {
if (obj instanceof Element) {
Element element = (Element) obj;
String elementName = element.getName();
switch (elementName) {
case "complexType":
String name = data.getClass().getAnnotation(XmlName.class).name();
processObject(element, outputElement.addElement(name), data);
break;
case "sequence":
case "all":
processObject(element, outputElement, data);
break;
case "attribute":
processAttribute(element, outputElement, data);
break;
case "element":
processElement(element, outputElement, data);
break;
default:
break;
}
}
}
}


private void processAttribute(Element element, Element outputElement, Object data) throws Exception {
String name = element.attributeValue("name");
String use = element.attributeValue("use");
Object value = getObject(data, name);
if ("required".equals(use) || value != null) {
outputElement.addAttribute(name, formatValue(value));
}
}


private String formatValue(Object value) throws Exception {
if (value == null) {
return "NA";
} else if (value instanceof Date) {
return DateFormatUtils.ISO_DATETIME_FORMAT.format((Date) value);
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).toPlainString();
} else {
String strValue = value.toString();
if (StringUtils.endsWith(strValue, "%")) {
try {
BigDecimal number = new BigDecimal(strValue.substring(0, strValue.length() - 1));
return number.divide(DIVISOR_PERCENTAGE).toPlainString();
} catch (Exception e) {
}
} else if (StringUtils.endsWith(strValue, " bps")) {
strValue = StringUtils.removeStart(StringUtils.removeEnd(strValue, " bps"), "+");
}
return strValue;
}
}


private void processElement(Element xsdElement, Element outputElement, Object data) throws Exception {
String refName = xsdElement.attributeValue("ref");
if (refName != null) {
Element refElement = findElement(xsdRoot, refName);


Object newData = getObject(data, refName);
if (newData != null) {
processObject(refElement, outputElement, newData);
}
} else {
String elementName = xsdElement.attributeValue("name");
Element complexElement = xsdElement.element("complexElement");
Object newData = getObject(data, elementName);


if (newData != null) {
if (complexElement == null) {
Element newOutputElement = outputElement.addElement(elementName);
newOutputElement.setText(formatValue(newData));
} else {
processObject(complexElement, outputElement, newData);
}
}
}
}


private Object getObject(Object obj, String name) throws Exception {
Class<?> clazz = obj.getClass();
Map<String, Method> map = SheetXMLUtil.getReaderMap(clazz);


Method method = map.get(name);
if (method == null) {
throw new RuntimeException(name + " not found in Class " + clazz.getName());
} else {
return method.invoke(obj);
}
}


private Element findElement(Element baseElement, String name) {
for (Object element : baseElement.elements("element")) {
if (element instanceof Element) {
if (((Element) element).attribute("name").getValue().equals(name)) {
return ((Element) element);
}
}
}
throw new RuntimeException("Element:" + name + " not found");
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值