2012-02-27 118 views
2

我不是java中的新手,而是XML和DTD文件中的新手。我有一个工具(我写的)将项目保存为XML。您可以从主项目创建应用程序,但我必须根据主项目检查应用程序的有效性。因此,对于每个主要项目,我必须创建一个DTD文件以及XML文件。这样我可以检查应用程序(也是XML文件)再次检查该DTD文件。我如何使用Java生成该dtd文件。如何使用java生成DTD文件

+0

如果你只是生成它,DTD将是无用的,它不会检查任何有用的东西。听起来你所有的项目XML文件都应该根据相同的DTD进行验证。 – 2012-02-27 20:48:40

回答

0

我建议你使用XML模式的.xsd而不是DTD。

它拥有超过一个DTD几个优点:

  1. 的.XSD XML; DTD不是。
  2. 模式将比DTD做更彻底的检查。它可以强制执行的类型,正则表达式,枚举等
  3. 喜欢的IntelliJ智能IDE可以从现有的XML为你生成一个模式,反之亦然。

模式是很容易用文本编辑器来生成。我认为这是一个值得的练习。

我不会推荐在任何情况下生成这样的事情。您正在表达关于架构或DTD中文档的大量知识。

0

的DTD往往得到一个坏名声,而且往往较差的考虑的原因,如人们可称之为“开发商代言和时装”(例如,最新的东西就是最好的东西)。例如,认为DTD不是XML是很奇怪的。我认为人们通常意味着DTD的语法不是XML文档标记语法,这是正确的。但dtd是本质 XML,也就是说,它们是XML推荐的非常重要的一部分,肯定moreso比XML Schema,它像XML命名空间后来大批的附加建议,其中提出了一个棘手的问题“之一什么是兼容的XML文档?“但我们在这里不会碰到那个。什么确定是每个合规的XML处理器都需要支持DOCTYPE声明和DTD处理;它是免费的,你不需要别的东西。而诸如Apache目录解析器之类的项目同时支持TR 9401和XML目录(“实体解析”),该解决方案在开源和商业产品方面有着悠久的行业支持历史。

相比之下,所有XML处理器都不支持XML Schema(或至少一致如此),并且XSD链接到文档实例的方式通过一些相当复杂的XML名称空间属性来处理文档实例的一部分(根元素上的属性),而不是序言的一部分。 (基本上,这意味着处理器必须在获取模式之前开始处理文档,如果您不了解这种区别的重要性,则应该做一些作业)。使用多个XSD的混合文档类型之间的相互依赖关系很复杂且没有详细说明。您可能会发现您必须提供您自己的实体解决方案支持。

而且具有XML标记你的架构并不总是有益的,除非你打算通过软件工具来管理他们。 DTD更具人类可读性,尽管存在一些相反的意见,但您可以使用命名空间前缀(请参阅XHTML Modularisation)。如果您的验证要求主要是结构性的(例如,您的内容是以文档为中心而非以数据为中心的),那么您可能不会验证内容,而是验证标记。 DTD对此很好。您也可以考虑完全不同的验证和文档约束方法,比如Schematron,它很好地增强了DTD验证。最后,大多数可以生成XSD的工具也可以生成DTD,并且有可用的转换应用程序(请参阅James Clark的trang)。

DTD也会和XML一样长,比如50-100年。从长远来看,我们可能会发现XML Schema将无法生存:它只是众多可行的竞争对手中的一个,因为XSD的许多缺陷,竞争对手到达现场。我发现DTD和Schematron的组合非常适合我的需求,并且是一个灵活的解决方案。但是YMMV。

总之,在接受通用的分散式建议之前,您应该真正看看您的实际模式/约束要求。你可能会发现DTD工作得很好。他们自1971年左右开始就这样做了。

+0

“... DTD更易于人类阅读......” - 您的意见;我不同意。没有人知道XML是否能够存活50 - 100年。更多的猜测。处理模式现在已内置到Java JDK中,因此您关于一致支持的声明不再正确。 DTD可能早于XML,但XML规范本身可追溯到1998年:http://www.w3.org/2003/02/xml-at-5.html – duffymo 2012-02-27 23:45:51

+0

您显然从未尝试过读取或编辑XML模式中的复杂内容模型。您可以在文本编辑器中使用DTD进行此操作;在XSD中,你最好使用一个工具,否则你会很快失去。我很清楚SGML和XML规范的日期,所以我不确定你的意思。 SGML的根源可以追溯到60年代,至于XML,我一开始就在那里,并收到了第一个规范的打印副本。自80年代后期以来,我一直使用SGML(工作于工业领域),所以我可以说一些在专业环境中负责DTD和XSD的经验。 – 2012-05-08 01:16:58

+0

现在就开始回应?我们都会保留我们的意见。你的评论并不能说服我。 – duffymo 2012-05-08 01:24:16

1

我这样做的方式是使用JAXB对象和注释,而XSD代替DTD。

  • 创建JAXB与代表你的XML的结构标注Java对象,
  • 写(“马歇尔”),以使用Marshaller
  • 使用schemagen产生从JAXB对象和XSD文件的注释。

作为奖励,JAXB将允许您将XML读回到您的对象结构中。