利用dom4j的visitor模式对xml文件的“反射”

给定一个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 + "/");");
 }
 
 // 其它重载函数...
 // ...
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#pragma once #include "xmlhelper/easyxml.hpp" #include "vtString.h" #include "vtMathTypes.h" struct vtBandInfo { vtString name; vtString colorInterpretation; vtString nodata; int type;//1为数据波段;2为掩码波段 }; class vtPyramidInfo: public XMLVisitor { public: vtPyramidInfo(void); ~vtPyramidInfo(void); int WriteToXMLFile(const char* pydFileName); wstring initName; int LoadFromXMLFile(const char* pydFileName); private: //xml visitor void startXML() { level =0; bandsInfo.clear(); } void startElement(const char *name, const XMLAttributes &atts;) { level++; m_currentElementName+="."; m_currentElementName+=name; if (m_currentElementName==".vtPyramidInfo.Bands.Band") { vtString name = atts.getName(0); vtString val = atts.getValue(0); bandinfo.name = val; } } void endElement(const char *name) { level--; if (m_currentElementName==".vtPyramidInfo.Bands.Band") { bandsInfo.push_back(bandinfo); } else if (m_currentElementName==".vtPyramidInfo.PixelType") { sscanf(valueStr, "%d", &pixelType;); } else if (m_currentElementName==".vtPyramidInfo.Origin") { sscanf(valueStr, "%lf,%lf", origin.xPtr(),origin.yPtr()); } else if (m_currentElementName==".vtPyramidInfo.FinestResolution") { sscanf(valueStr, "%lf,%lf", finestResolution.xPtr(),finestResolution.yPtr()); } else if (m_currentElementName==".vtPyramidInfo.FinestSize") { sscanf(valueStr, "%d,%d",finestSize.xPtr(),finestSize.yPtr()); } else if (m_currentElementName==".vtPyramidInfo.BlockSize") { sscanf(valueStr, "%d,%d", blockSize.xPtr(),blockSize.yPtr()); } else if (m_currentElementName==".vtPyramidInfo.lzts") { sscanf(valueStr, "%lf", &lzts;); } else if (m_currentElementName==".vtPyramidInfo.ShareEdge") { sscanf(valueStr, "%d", &shareEdge;); } else if (m_currentElementName==".vtPyramidInfo.MinLevel") { sscanf(valueStr, "%d", &minLevel;); } else if (m_currentElementName==".vtPyramidInfo.MaxLevel") { sscanf(valueStr, "%d", &maxLevel;); } else if (m_currentElementName==".vtPyramidInfo.SpatialReference") { SRS = valueStr; } else if (m_currentElementName==".vtPyramidInfo.PixelLayout") { sscanf(valueStr, "%d",&pixelLayout;); } int size = strlen(name)+1;//plus a dot m_currentElementName = m_currentElementName.Left(m_currentElementName.GetLength()-size); } void data(const char* s, int length) { vtString typeStr(s,length); if (m_currentElementName==".vtPyramidInfo.Bands.Band.ColorInterpretation") { bandinfo.colorInterpretation = typeStr; }else if (m_currentElementName==".vtPyramidInfo.Bands.Band.Type") { sscanf(typeStr, "%d", &bandinfo;.type); }else if (m_currentElementName==".vtPyramidInfo.Bands.Band.NoDataVal") { bandinfo.nodata = vtString(s,length); } else { valueStr = typeStr; } } vtString m_currentElementName; int level; vtBandInfo bandinfo; vtString valueStr; public: /* 作者 :zjb 创建日期 :16:12:2012 9:58 功能业务说明: pixelType PIXELTYPEENUM_UNKNOWN = 0, //"未知类型" PIXELTYPEENUM_BYTE = 1, //"字节" size=1字节 PIXELTYPEENUM_USHORT16 = 2, //"无符号位整数" size=2字节 PIXELTYPEENUM_SHORT16 = 3, //"16位整数" size=2字节 PIXELTYPEENUM_UINT32 = 4, //"无符号位整数" size=4字节 PIXELTYPEENUM_INT32 = 5, //"32位整数" size=4字节 PIXELTYPEENUM_FLOAT32 = 6, //"32位浮点数" size=4字节 PIXELTYPEENUM_DOUBLE64 = 7, //"64位浮点数" size=8字节 PIXELTYPEENUM_CSHORT16 = 8, //"复合位整数" size=2字节*2个 PIXELTYPEENUM_CINT32 = 9, //"复合位整数" size=4字节*2个 PIXELTYPEENUM_CFLOAT32 = 10, //"复合位浮点数" size=4字节*2个 PIXELTYPEENUM_CDOUBLE64 = 11, //"复合位浮点数" size=8字节*2个 PIXELTYPEENUM_TYPECOUNT = 12 //"类型的数目" */ int pixelType; DPoint2 origin; DPoint2 finestResolution; IPoint2 finestSize;//最高level的栅格大小 IPoint2 blockSize; double lzts; int shareEdge;//是否共享边界 int minLevel; int maxLevel; vtString SRS; /* 作者 :zjb 创建日期 :16:12:2012 9:57 功能业务说明:pixelLayout PIXELLAYOUTTYPEENUM_BSQ = 0, //Band SeQuential also "BAND":Band sequential format stores information for the image one band at a time. In other words, data for all the pixels for band 1 is stored first, then data for all pixels for band 2, and so on. PIXELLAYOUTTYPEENUM_BIP = 1, //Band Interleaved by Pixel ,also "PIXEL":Band interleaved by pixel data is similar to BIL data, except that the data for each pixel is written band by band PIXELLAYOUTTYPEENUM_BIL = 2 //Band Interleaved by Line ,aslo "LINE":Band interleaved by line data stores pixel information band by band for each line, or row, of the image */ int pixelLayout; vector<vtBandInfo> bandsInfo; };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值