2010-09-08 50 views
0

我有a large XML schema有看起来像这样的内容:如何最有效地获得在C#中的类此的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> 

有效地使用它,我需要documentation元素的元素name属性之间的关联,并,如:

TestItem <==> TA 

我首先想到的是,要素应该有属性来捕捉文档元素,像这样:

public partial class Tmats 
{ 
    [Documentation("PN")] 
    public string ProgramName { get; set; } 

    [Documentation("TA")] 
    public string TestItem { get; set; } 
} 

...但我关心性能,因为这些属性在正常使用过程中会被相当广泛地扫描。

我第一次尝试使用XSD.EXE创建C#类,但该工具似乎根本没有捕获注释元素。另外,它创建的代码非常难看。

对此提出建议?有没有更好的方法来解决这个问题?

回答

1

您可能需要编写自己的xsd.exe替换程序。 AFAIK xsd.exe不支持<xs:annotation>元素。

一个相当不错的博客介绍了如何编写自己的基于XSD的代码生成器(它是中等复杂的,顺便说一句,并根据我个人的经验有没有必要建立它太一般):

http://blogs.rev-net.com/ddewinter/2008/09/28/generate-serialization-classes-as-part-of-your-build-part-2/

注意:在博客条目中,<xs:annotation>节点用于通过CodeDOM生成文档。当然,你可以生成更好的东西来满足你的需求。

0

棘手的问题。你说这个模式很大。锄头你经常会预料到它会发生变化吗?手工编写C#版本可能很乏味,但如果预计变化不大,那么您将获得所需的接口,因为您是编码的接口。但是,如果它有机会经常更改,那么需要频繁更新映射和广泛的单元测试套件,以确保不会破坏更新中的任何内容。

我过去所做的是使用XSD工具生成初始代码,然后从生成的类中进行扩展,或者使其成为一个部分类来修复我喜欢的接口。没有任何意义,但它使我能够生成大部分代码,是的,丑陋的,但生成的,并定制我关心的接口,使它们更友好一点,并添加任何可能的错误/边界检查有用。

+0

它不会有太大的变化,但它代表了一个标准,所以如果它可以被导入而不是修补,它将会很好。 – 2010-09-08 17:27:58

相关问题