给定一个xml文件,由于dom4j支持visitor模式,可以得到生成该xml文件内容的java代码(dom4j的API),在某些时候,可能会有用处。比如给定一个行数超过50行的范例xml文件,其内容需要用java代码生成。若使用该工具,则可以极大地减轻敲代码的工作量,执行该工具,即可输出该范例xm文件所l对应的java生成代码,值得一试。
附:程序代码(需要dom4j的jar文件)
package cn.jsfund.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* 对某个xml文件进行“反射”,得到能够生成该xml文件内容的dom4j的java代码
* @author luocm
*
*/
public class Dom4jDemo {
private static String xmlFileName = "d:/catalog.xml";
public static void main(String[] args) {
generateDocument();
reflectXML();
}
// 运用dom4j的API,生成xml文档
public static void generateDocument() {
Document document = DocumentHelper.createDocument();
Element catalogElement = document.addElement("catalog");
catalogElement.addComment("An XML Catalog");
catalogElement.addProcessingInstruction("target", "text");
Element journalElement = catalogElement.addElement("journal");
journalElement.addAttribute("title", "XML Zone");
journalElement.addAttribute("publisher", "IBM developerWorks");
Element articleElement = journalElement.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2001");
Element titleElement = articleElement.addElement("title");
titleElement.setText("Java configuration with XML Schema");
Element authorElement = articleElement.addElement("author");
Element firstNameElement = authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
Element lastNameElement = authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");
//document.addDocType("catalog", null, "file://c:/Dtds/catalog.dtd");
// xml文档输出到文件(美化/紧凑模式)
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter output = new XMLWriter(new FileWriter(
new File(xmlFileName)), format);
output.write(document);
output.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
// xml文档的自我反射(利用Visitor模式),打印出生成该xml文档的dom4j的API代码
public static void reflectXML() {
SAXReader reader = new SAXReader();
//String fileName = "d:/NSH011021101020001-20070306-0006-0049.xml";
Document document = null;
try {
document = reader.read(new File(xmlFileName));
document.accept(new MyVisitor());
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
// dom4j对Visitor模式的支持,可以编写访问某节点(Element/Attribute...)时执行的代码
class MyVisitor extends VisitorSupport {
// 访问元素代码
public void visit(Element element) {
Element parent = element.getParent();
String parentTagName = (parent == null) ? "root" : parent.getName();
String tagName = element.getName();
String text = element.getText();
System.out.println("Element " + tagName + " = " + parentTagName
+ ".addElement(/"" + tagName + "/");");
if (text != null && text.trim().length() > 0) {
System.out.println(tagName + ".setText(/"" + text + "/");");
}
}
// 访问元素属性的代码
public void visit(Attribute attr) {
Element element = attr.getParent();
String tagName = element.getName();
String attrName = attr.getName();
String attrText = attr.getText();
System.out.println(tagName + ".addAttribute(/"" + attrName + "/", /""
+ attrText + "/");");
}
// 其它重载函数...
// ...
}