【发布时间】:2012-05-28 17:20:10
【问题描述】:
我有几个大的 DTD 文件。我已经使用trang 将它们转换为 XSD 文件,因此我可以轻松地从 JAXB 和其他实用程序中使用它。但是,生成的 XSD 文件在顶层具有所有声明的元素。这意味着任何元素都可以是输入 XML 的根元素。我只想指定一个特定的元素。
拥有这些多个根元素会导致一些问题,例如xjc 为所有类生成@XmlRootElement,所以我需要添加更多额外的检查。
据我了解,我需要重写生成的 XSD,将 <xs:element>s 移动到 <xs:complexType>s,将 element refs 更改为 element types 等等,但这将是太多的猴子工作,与无法验证是否所有操作都正确。
有没有更有效的方法来做到这一点?
【问题讨论】:
-
+1 表示一个有意义的问题,但我们还要明确一点,DTD 到 XSD 的转换始终只是近似值。
-
@JirkaHanika 据我了解,生成的 XSD 非常接近 DTD。除了 DOCTYPE 定义(不过并不奇怪)和一些命名空间的东西。此外,一些奇怪的 DTD 结构也无法巧妙地转换为 XSD。我目前面临的唯一问题是 DTD 没有定义根元素的概念。 (RelaxNG 确实用
<start>定义了它,但它的支持很差,xjc失败了)。 -
是的,但是命名空间的东西是个大问题。此外,许多命名相似的结构意味着完全不同的东西。对第一个答案 +1,因为它不假装任何 XSD 语义。
-
正确定义文档非常重要,无论是哪种灵长类动物,我认为都应该手工完成。唯一比不得不做更糟糕的是做错了。