Проверка XML для элемента с несколькими типами? - PullRequest
0 голосов
/ 10 сентября 2009

У меня есть элемент, который может иметь несколько типов (не мой дизайн). Сам элемент является сложным типом с последовательностью подэлементов, и XML генерируется из сериализации свойства, и это свойство возвращает тип базового класса. Таким образом, когда генерируется XML, тип в конечном итоге становится установленным в XML, каким бы он ни был на самом деле. Например:

      <Answer xsi:type="AnswerBool">
        <Value xsi:type="xsd:int">-1</Value>
      </Answer>

Или это может быть:

      <Answer xsi:type="AnswerString">
        <Value xsi:type="xsd:string">-1</Value>
      </Answer>

Свойство C # выглядит так:

    public AnswerBase Answer
    {
        get { return mViewAnswer; }
        set { mViewAnswer = value; }
    }

Таким образом, если переменная nViewAnswer имеет тип AnswerBool, то первый пример XML генерируется при сериализации. Если он имеет тип AnswerString, то генерируется второй XML-пример.

Итак, я работал над каким-то XSD для XML. Тем не менее, когда дело доходит до проверки, я не могу заставить это работать. Очевидно, что одним из вариантов было бы изменить структуру XML и добавить подэлементы элемента «Ответ». Однако это потребует переделки существующей функциональности, которую я предпочел бы избежать, если это возможно. Так ....

Есть ли способ, чтобы элемент имел разные типы, определенные в схеме?

Или есть ли способ настроить XSD таким образом, чтобы он игнорировал тип xsi: для этого элемента во время проверки? Я возился с любым атрибутом processContents, но я не верю, что это поможет.

Собираюсь ли я застревать, заново работая над тем, как формируется XML?

Ответы [ 2 ]

1 голос
/ 14 сентября 2009

Мне не удалось заставить мой XML работать с любой схемой, которую я пробовал. Выглядело так, как будто у меня почти все было с генерацией моего собственного атрибута "type", но в конечном итоге я понял, что мой XML имел:

      <Answer xsi:type="AnswerBool">
        <Value xsi:type="xsd:int">-1</Value>
      </Answer>

Мне не удалось обработать "xsi:" часть "type", так как мой атрибут был просто "type" и поэтому не совпадал с "xsi: type". Мои экземпляры схемы были одинаковыми, поэтому я не знаю, почему возникла проблема.

Так что я буду что-то менять, чтобы у меня больше не было ни одного элемента «Ответить». У меня будет несколько десятков разных элементов, по одному для каждого типа. Облом.

Спасибо за помощь, Марк.

1 голос
/ 10 сентября 2009

Отметьте этот пост , который, если больше ничего не укажет на дальнейшее чтение.

Может быть не так уж и плохо переделывать xml, если вы подумаете о преобразовании. Обычно вы застряли с проблемным xml по какой-то причине, то есть некоторые существующие системы экспортируют его таким образом. Преобразование с использованием xslt позволит вам сохранить устаревший xml, а также иметь его в новом формате для проверки на соответствие новой схеме. Двойной бонус в том, что вы знаете, что преобразованный xml действителен.

...