如何在C#类中最好地捕获此XML Schema

时间:2010-09-08 15:55:22

标签: c# attributes xsd xsd.exe

我的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#类,但该工具似乎根本不捕获注释元素。另外,它创建的代码非常难看。

连连呢?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分: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生成文档。当然,你可以生成更符合你需求的其他东西。

答案 1 :(得分:0)

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

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