从XML Schema或DTD生成代码
使用XMLSpy代码生成器,您可以从XML Schema或DTD中生成C#、C++或Java程序代码。然后可以将生成的Schema包装库集成到您的自定义应用程序中,以便以编程方式读取、修改或编写XML文档。
生成程序代码
1.打开要为其生成源代码的Schema。
2.选择DTD/Schema|生成程序代码菜单项。
3.在弹出的对话框的选择模板窗格中,设置代码生成器选项。
4.单击确定。将出现浏览文件夹对话框。
5.选择目标文件夹并单击确定。
6.系统会提示您在Microsoft Visual Studio中打开新创建的项目。单击是。如果生成了Java代码,系统将提示您打开相应的输出目录。
当使用XMLSpy从XML Schema或DTD生成代码时,将创建以下库:
C++或C# | Java | 目的 |
Altova | com.altova | 包含公共运行时支持的基础库,对所有Schema都是相同的。 |
AltovaXML | com.altova.xml | 包含XML的运行时支持的基础库,对所有Schema都是相同的。 |
[YourSchema] | com.YourSchema | 包含从与Schema文件或DTD同名的输入Schema生成的声明的库。此库是一个DOM(W3C文档对象模型)包装器,允许您轻松并安全地读取、修改和创建XML文档。所有数据都保存在DOM中,并且有一些方法可以从DOM中提取数据、并在DOM中更新和创建数据。
生成的C++代码支持Microsoft MSXML或Apache Xerces 3。两种DOM实现使用生成的代码的语法几乎相同,只有细微差别(例如,Xerces支持更多的重载函数)。
生成的C#代码使用.NET standard System.XML库作为底层DOM实现。
生成的Java代码使用JAXP(Java API for XML Processing)作为底层DOM接口。 |
[YourSchemaTest] | com.YourSchemaTest | 生成的代码还包含一个以您的Schema命名的测试应用程序框架(例如,YourSchemaTest)。这是一个可编译的应用程序,它调用一个空的Example()方法。您可以将您的测试代码添加到此方法中,以便轻松快速地测试您新生成的库。 |
在根据频繁更改的XML Schema对应用程序进行原型设计时,您可能需要频繁地将代码生成到同一目录,从而将Schema更改及时反映在代码中。请注意,每次将代码生成到同一个目标目录中时,都会覆盖生成的测试应用程序和Altova库。因此,不能将代码添加到生成的测试应用程序中。取而代之的是,将Altova库集成到您的项目中(参见集成Schema包装库)。 |
名称生成和命名空间
XMLSpy为在XML Schema中重新定义复杂类型的任何已声明元素或复杂类型生成类,,并保留由XML Schema中复杂类型的扩展定义的类派生。对于从多个命名空间导入组件的复杂Schema,XMLSpy通过生成适当的C#或C++命名空间或Java包来保留此信息。
通常,代码生成器会尝试保留原始XML Schema中生成的命名空间、类和成员的名称。在目标语言中,标识符中无效的字符将被替换为“_”。与其他名称或保留词冲突的名称可通过追加数字来唯一标识。可以通过在SPL模板中更改默认设置来影响名称生成。
使用Schema中的命名空间前缀作为代码命名空间,XML Schema的命名空间转换为Java中的包,或C#或C++代码中的命名空间。整个库括在包中,或从Schema文件名派生的命名空间中,因此您可以在一个程序中使用多个生成的库,而不会出现名称冲突。
数据类型
XML Schema的数据类型模型比Java、C#或C++更复杂。代码生成器将内置的XML Schema类型转换为特定于语言的原始类型,或Altova库提供的类。在Schema中定义的复杂类型和派生类型将转换为生成的库中的类。简单类型中的枚举方面将转换为符号常量。
简单类型的映射可以在SPL模板中配置,请参见SPL引用。
如果您的XML实例文件使用与时间和持续时间相关的Schema类型,它们将在生成的代码中转换为Altova本机类。有关Altova库类的信息,请参见:
有关每种语言的类型转换和其他详细信息,请参见:
内存管理
DOM树由始终与特定的DOM文档相关联的节点组成,即使该节点当前不是文档内容的一部分。所有生成的类都是对它们所表示的DOM节点(不是值)的引用。这意味着当分配生成类的实例时,不会复制值,它仅创建对相同数据的附加引用。
XML Schema支持
以下XML Schema构造函数转换为代码:
a) XML命名空间
B) 简单类型:
•内置XML Schema类型
•通过扩展派生的简单类型
•通过限制派生的简单类型
•方面
•枚举
•模式
c)复杂类型:
•内置anyType节点
•用户定义的复杂类型
•通过扩展派生:映射到派生类
•通过限制派生
•复杂内容
•简单内容
•混合内容
在生成的包装类中不支持(或不完全支持)以下XML Schema高级功能:
•通配符:xs:any and xs:anyAttribute
•内容模型(sequence, choice, all)顶级排序符在SPL中可用,但不是由生成的类执行的。
•特性的默认值和固定值这些都在SPL中可用,但不由生成的类设置或执行。
•特性xsi:type,抽象类型如果需要编写xsi:type特性,请使用生成的类的SetXsiType()方法。
•联合类型:并非所有组合都支持。
•部分支持替换组(像“choice”一样解析)
•特性nillable="true"和xsi:nil
•唯一性约束
•标识约束(key和keyref)