Как лучше всего захватить эту XML-схему в классах C # - PullRequest
0 голосов
/ 08 сентября 2010

У меня есть большая 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; }
}

... но меня беспокоит производительность, так как эти атрибуты будут сканироваться довольно широко при обычном использовании.

Я сделал первый шаг при создании классов C # с использованием XSD.EXE, но этот инструмент некажется, чтобы захватить элементы аннотации вообще.Кроме того, код, который он создает, довольно уродлив.

Предложения?Есть ли лучший способ приблизиться к этому?

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Возможно, вам придется написать собственную замену xsd.exe. AFAIK xsd.exe не поддерживает <xs:annotation> элементов.

Достаточно приличный блог описывает, как написать свой собственный генератор кода на основе xsd (это, кстати, средняя сложность, и, исходя из моего личного опыта, нет необходимости создавать его слишком обобщенно):

http://blogs.rev -net.com / ddewinter / 2008/09/28 / генерировать-сериализацию-классы-как-часть-из-вашей-наращивания части-2 /

Примечание: в записи блога узел <xs:annotation> используется для генерации документации через CodeDOM. Естественно, вы можете создать что-то еще, что лучше соответствует вашим потребностям.

0 голосов
/ 08 сентября 2010

Сложный вопрос.Вы говорите, что схема большая.Мотыга часто вы ожидаете, что это изменится?Ручное кодирование версии C # может быть утомительным, но если не ожидается, что оно сильно изменится, то вы получите желаемый интерфейс, так как именно вы его кодируете.Однако, если у него есть возможность часто меняться, это потребует частого обновления карт и обширного набора модульных тестов, чтобы вы ничего не сломали в своих обновлениях.

То, что я делал в прошлом, этоиспользовать инструмент XSD для генерации исходного кода, а затем либо расширять сгенерированные классы, либо сделать его частичным классом, чтобы исправить интерфейс по своему вкусу.Во всяком случае, не идеальный, но он дал мне возможность генерировать большую часть кода, да, некрасиво, но сгенерировал, и адаптировать интерфейсы, которые мне нужны, чтобы сделать их немного более дружелюбными и добавить любую проверку ошибок / границ, котораябыть полезным.

...