实用数据绑定: 往返和 XML 到 Java 的转换 3

 清单 5. 模式中的布尔类型

双击代码全选
1
2
3
4
5
6
7
8
9
10
< xsd:simpleType   name = "xsd:boolean" > 
 < xsd:restriction   base = "xsd:string" > 
  < xsd:enumeration   value = "true" /> 
  < xsd:enumeration   value = "True" /> 
  < xsd:enumeration   value = "TRUE" /> 
  < xsd:enumeration   value = "false" /> 
  < xsd:enumeration   value = "False" /> 
  < xsd:enumeration   value = "FALSE" /> 
 </ xsd:restriction > 
</ xsd:simpleType > 

  看起来不错,是吧?但问题是它还不能解决这个问题。JAXB 根据 XML Schema 中 xsd:string 构造的用法,仍然会生成接受字符串参数的类。

  在您准备告诉我这不成为一个问题之前,先让我说明 JAXB 通过 什么来保护您的数据。当从 Java 类编组回到 XML 时,将调用根据 XML Schema(和限制性的类型,如 清单 2和 清单 5所示)生成的验证方法。换句话说,如果您为 bearclaw 属性提供了一个值“foobar”,它就会被找出来。不过像“TRUe”、“fAlSe”和“tRue”这样的值--当然也不想要这种结果--在验证过程中也会被找出来。现在就需要使用 清单 5中详细定义的类型, 还要注意“true”和“false”这两个词因为大小写带来的变化。这种繁杂的工作看起来意义不大。正是这类问题使得往返非常复杂,真正实现要比说起来困难得多。这也 恰恰是在选择和使用数据绑定软件包时应该考虑到的那类问题。

  更加需要关注的是,至少对我而言,这样可能造成超出单次往返过程的问题。要知道错误检查只有在编组时进行,这意味着只要还在内存中,错误数据就可以自由地存在于这些成员变量之中等待编组。另外, 任何具有有限值集的性质都存在这种问题,而不仅仅是布尔值。但其中最值得注意的问题是,有时候 XML 文档被读入、处理然后供其他应用程序使用,而不是被编组回到 XML。因此所有的应用程序都有可能在这些字段中插入错误的数据,而其他任何使用数据的应用程序都会得到那个错误数据。除非希望每次访问信息时都编组类,否则这个问题就确实存在。顺便说一句,这些问题表明数据绑定相对而言还不够成熟,而不仅仅是 JAXB。

  我该怎么做?

那么您能做什么呢?首先要坚持阅读这些文章。我将详细分析 JAXB,后面还将探讨 Castor,尝试标志出那些需要注意的地方。不知道问题的关键在哪里,就不能编写防弹代码和错误检查代码;这正是本文以及后面几篇文章的核心。更重要的是,要认识到即使最好的数据绑定软件包,也需要一两个很棒的程序员增加另外的保护措施,才能使其正确地运行。

  最后还要记住,数据绑定并不总是魔法子弹。我并不想打消你们对数据绑定的兴趣,恰恰相反,我认为它是一种了不起的应用程序。但是有时候一个简单的 SAX 程序或者 DOM 树就能提供需要的全部功能,就不需要再引入数据绑定项目的复杂性了。在以后的专栏中,我将分析使用数据绑定的最佳时机,什么时候使用 SAX 和 DOM 更有效,并通过大量的例子帮助您作出决策。

  结束语

显然这里关于 JAXB 的分析还不够完全,但是您已经看到了研究数据绑定软件包时有价值的分析方法。选择一个数据绑定软件包要比选择喜欢的网站和单击链接复杂得多,要保证选择的应用程序能够正确处理像往返这样的问题。

  JAXB 仍然不够成熟,仍然是一种非常新的技术的较早主要版本。还要记住 JAXB 以前的几个版本基本上已经废弃了(还记得当时 JAXB 只能使用 DTD 吗?它现在只能使用 XSD),因此 1.x 版是对这类问题真正的 第一次尝试。并不说不应使用 JAXB,只是说必须小心谨慎。

  下一篇文章,我将从类生成转移到解组和编组,并说明它是如何工作的。我还将钻研像空格、CDATA 节以及许多其他问题的处理。请继续坚持,您将看到更多的代码、更多的细节和更多的乐趣。下一次网上见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值