0

我有一个大型 XML 模式,其中包含如下所示的元素:

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

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

4

2 回答 2

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 生成文档。当然,您可以生成其他更能满足您需求的东西。

于 2010-09-08T17:11:17.983 回答
0

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

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

于 2010-09-08T16:37:22.557 回答