Altova XMLSpy 2023 Enterprise Edition

当DTD为活动文档时,将启用将DTD转换为Schema命令。它会将DTD转换为XML Schema文档(XSD)。

 

使用此命令将弹出“转换DTD为W3C Schema”对话框(参见下方截图),您可以在其中选择是否应将复杂元素转换为元素或复杂类型。单击确定后,系统会提示您选择一个位置来保存生成的XSD文件。单击保存以执行转换。XSD文件将被生成并在XMLSpy中打开。

dlgDTD2XSD

在将DTD转换为XML Schema时,由于可用信息有限,XMLSpy将做出一些假设。最值得注意的是,某些DTD组件的值将按字面意思处理,而不是对其语义进行解析。这是因为程序无法知道要用于何种目的。在这种情况下,您应该修改生成的转换文档。

 

无论如何您都应该仔细检查生成的转换文档以查看是否要对其进行改进。下方列出了一些可能需要改进的地方。

 

 

特性数据类型

DTD仅允许使用10种特性数据类型,而XML Schema允许使用40种以上的数据类型以及派生的数据类型。您可能希望对生成的XML Schema进行改进,比如,通过使用一个更有限制性的数据类型。请注意,在将XML Schema转换为DTD时,数据类型信息将丢失。

 

 

命名空间

DTD不支持命名空间。因此,如果要在DTD中指定命名空间,必须将其硬编码到元素和特性名称中。这可能会在从一个Schema转换为另一个时导致一些问题。

 

 

实体

XML Schema没有对应于DTD的常规实体声明的组件。在XMLSpy中将DTD转换为XML Schema时,它会忽略实体声明。

 

 

未分析的数据声明

DTD和XML Schema在处理未分析的数据上使用不同的机制。下方对这一点进行了详细解释。

 

DTD使用以下机制:

 

声明一个由一个名称和一个标识符组成的符号,例如:
<!NOTATION gif SYSTEM "image/gif">

例如,实体按以下方式声明:
<!ENTITY cover_img SYSTEM "graphics/cover_img.gif" NDATA gif>

通常,您可以在相关特性上指定ENTITY的特性类型,例如:<!ELEMENT img EMPTY>

      <!ATTLIST img format ENTITY #REQUIRED>

 

在XML Schema中,对应的机制如下:

 

声明一个符号。这与在DTD中的功能相同。

<xs:notation name="gif" public="image/gif"/>

 

请注意,public特性是必需的,并且包含标识符。可选的system特性包含系统标识符,通常是一个可以处理符号类型资源的可执行文件。

您可以使用NOTATION数据类型将notation声明与给定的特性值相关联。但是,您不能直接使用NOTATION数据类型,但必须从NOTATION数据类型派生另一个数据类型。

<xs:simpleType name="formatType">

  <xs:restriction base="xs:NOTATION">

     <xs:enumeration value="gif"/>

     <xs:enumeration value="jpeg"/>

  </xs:restriction>

</xs:simpleType>

您可以将特性与从NOTATION数据类型派生的数据类型相关联,例如:

<xs:complexType name="imgType">

  <xs:attribute name="height"/>

  <xs:attribute name="width"/>

  <xs:attribute name="location"/>

  <xs:attribute name="format" type="formatType" use="required"/>

</xs:complexType>

<xs:element name="img" type="imgType"/>

 

在将DTD转换为XML Schema时,XMLSpy执行以下操作:

 

例如:

<!ATTLIST image format ENTITY #REQUIRED

...>

 

被转换为

<xs:attribute name="format" type="xs:ENTITY" use="required"/>

 

例如:

<!NOTATION gif SYSTEM "image/gif">

 

被转换为

<xs:notation name="gif" system="image/gif"/>

 

因此,您应该做以下修改:

 

1.在类似<xs:notation name="gif" system="image/gif"/>的符号中,将system替换为public,并根据需要添加一个可选的系统标识符。

2.如上文对formatType的描述那样,从NOTATION数据类型派生一个数据类型。

3.将派生的数据类型与相关特性相关联。

 

提示:根据XML Schema规范,您不需要或不能(取决于您的观点)声明一个外部实体。

 

© 2017-2023 Altova GmbH