快速业务通道

从XML到Java代码的数据绑定之三 从文本到字节码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
rshaller 类,则需要在将 XML 绑定到 Java 的完整过程上递归。一旦读取了所有属性并将它们分配给已创建的 Java 实例,就需要取出每个嵌套元素,然后再次执行取消编组。

通过迭代所提供根的子元素,来完成 XML 文档的处理,如清单 5 所示。这些子元素中的每一个都将成为另一个对象,这就表示必须以该元素作为根元素重新开始取消编组过程。

清单 5. 用递归处理嵌套元素

// Now do complex objects        List elements = rootElement.getChildren();        for (Iterator i = elements.iterator(); i.hasNext(); ) {          Element element = (Element)i.next();          // Only want elements for this namespace          if ((!element.getNamespace().equals(ns)) &&          (!element.getNamespace().equals(Namespace.NO_NAMESPACE))) {            continue;          }          // Determine method to call          String methodName = new          StringBuffer()            .append("set")            .append(BindingUtils.initialCaps(element.getName()))            .toString();          // Find the method to call, and its parameter type          for (int j=0; j<methods.length; j++) {            if (methods[j].getName().equals(methodName)) {              // Since all mutators have one param, get the first one              Class[] paramTypes =              methods[j].getParameterTypes();              Class paramType = paramTypes[0];      // Convert the type we have to the correct type              Object param = getJavaRepresentation(element);              // Invoke the method              methods[j].invoke(obj, new Object[] { param });            }          }        }

注:您也许注意到我在清单 5 中的取消编组中做了一个假设,即成员变量总是由 XML 属性表示,嵌套对象由 XML 元素表示。那么,这些元素可能有自己的属性和嵌套元素。我的假设是唯一设置的限制,并且是合理的。这意味着取消编组过程不必查看引用的 XML 模式并确定特性是由元素表示,还是由属性表示。这也会使编组过程变得更简单,将在本系列的下一篇文章中出现。如果所有这一切对您没有难度,那么只使用属性作为变量,元素作为对象,不必考虑嵌套和递归。

清单 5 中的代码看来很像上一段代码,其主要区别是用红色强调的几行。这段代码通过取消编组嵌套元素来获取参数,而不是使用 DataMapping 辅助类将文本值转换成 Java 数据类型。然后,返回的对象提供给适当的 mutator 方法(例如, setPort ),迭代继续进行。一旦递归从底层到顶层解开,则创建的 Java 对象将返回到调用应用程序。很快吗!数据绑定完成了。

通过使用运行的 unmarshaller 类,实际上,它最终使用了数据绑定工具。通过使用 XML 模式、XML 文档和一些简单的 Java 代码,访问 XML 就象访问 JavaBean 一样简单。

生成类

首先,确保已经从 XML 模式生成了 Java 类,如清单 6 所示。

清单 6. 从示例模式生成 Java 类

/projects/dev/binding> export CLASSPATH=/projects/dev/jdom/lib/xerces.jar /projects/dev/binding> export CLASSPATH=$CLASSPATH:/projects/dev/jdom/build/jdom.jar /projects/dev/bin

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号