我的a large XML schema元素看起来像这样:
<xs:element name="Tmats">
<xs:complexType>
<xs:sequence>
<xs:element name="ProgramName" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>PN</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="TestItem" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>TA</xs:documentation>
</xs:annotation>
</xs:element>
要有效地使用它,我需要元素name
属性和documentation
元素之间的关联,如:
TestItem <==> TA
我的第一个想法是元素应该具有捕获文档元素的属性,如下所示:
public partial class Tmats
{
[Documentation("PN")]
public string ProgramName { get; set; }
[Documentation("TA")]
public string TestItem { get; set; }
}
...但我担心性能,因为这些属性会在正常使用过程中被广泛扫描。
我首先尝试使用XSD.EXE创建C#类,但该工具似乎根本不捕获注释元素。另外,它创建的代码非常难看。
连连呢?有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
您可能必须编写自己的xsd.exe替换。 AFAIK xsd.exe不支持<xs:annotation>
元素。
一个相当不错的博客描述了如何编写自己的基于xsd的代码生成器(它的中等复杂性,顺便说一句,根据我的个人经验,没有必要太一般地构建它):
注意:在博客条目中,<xs:annotation>
节点用于通过CodeDOM生成文档。当然,你可以生成更符合你需求的其他东西。
答案 1 :(得分:0)
棘手的问题。你说架构很大。锄头经常会预料到它会改变吗?手工编写C#版本可能会很乏味,但如果预计它不会发生太大变化,那么您将获得所需的界面,因为您是编码它的人。但是,如果它有机会频繁更改,则需要经常更新映射和广泛的单元测试套件,以确保您不会破坏更新中的任何内容。
我过去所做的是使用XSD工具生成初始代码,然后从生成的类扩展,或者使其成为部分类来修复我喜欢的界面。任何意思都不理想,但它让我能够生成大部分代码,是的,丑陋的,但生成的,并定制我关心的接口,使它们更加友好,并添加任何可能的错误/边界检查很有用。