Помощь в прохождении сложного XSD-документа - PullRequest
1 голос
/ 02 июня 2011

Моя конечная цель состоит в том, чтобы просмотреть документ XSD и отобразить представление TreeView (Silverlight 4.0) всех элементов XML в порядке, как описано в документе XSD.

Итак, если бы у меня был файл XSD, которыйописывает набор элементов, который будет выглядеть как

<a>
  <b att1="foo" att2="foo2"/>
    <c />
  <d />
</a>

, тогда я хотел бы отобразить TreeView как:

 a
 |_b
 | |_att1
 | |_att2
 | |_c
 |_d

Мне все равно, если документ XSD допускает многократные вхожденияили необязательные элементы и атрибуты.Я хочу перечислить элементы, которые встречаются несколько раз только один раз, и все обязательные и дополнительные элементы / атрибуты должны появиться.Например, схема, которая позволяет

<a>
  <b att1="foo" att2="this one was optional"/>
    <c />
  <d />
  <d />
</a>

, должна по-прежнему возвращать тот же TreeView, который я показал ранее.

Однако у меня возникли проблемы с пониманием лучшего способа сделать это.Я начал использовать XmlReader для работы с документом xsd, но потом понял, что это может усложнить работу со ссылками на файлы ... например, элементы, имеющие атрибуты "ref" или "type" .... или элементы "extension".

Итак, я создал службу WCF, чтобы я мог использовать класс XmlSchema и посмотреть, что там было.Я написал следующий код:

XmlTextReader reader = new XmlTextReader("http://myXsdLocation.com/SalesOrder.xsd");
XmlSchema myschema = XmlSchema.Read(reader, ValidationCallback);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(myschema);
schemaSet.Compile();

После отладки этого кода счетчик schemaSet увеличивается до 8 после schemaSet.Compile (), что, как я предполагаю, означает, что со всеми ссылками «include» в исходном файле xsdКак и в ссылочных xsd-файлах, в общей сложности 8 xsd-файлов имеют смысл для начального.

Но из-за того, что я копался в объектах schemaSet, я не нашел способа элегантно пройти черезвся схема, как если бы это был один гигантский XSD-файл.

Кто-нибудь знает способ выполнить то, что я пытаюсь сделать?Я просто хочу иметь возможность извлекать каждый элемент в том порядке, в котором он будет выглядеть как один гигантский XSD-файл, и любые атрибуты, прикрепленные к элементу, и передавать данные в мой TreeView.Я согласен с пользовательским интерфейсом, но мне нужно знать, лучше ли написать свой собственный анализатор с XmlReader или использовать XmlSchema и связанные с ним классы.Я встречал похожие вопросы в StackOverflow, но большинство из них касалось инструментов кода или не связано с тем, что я ищу.Я хочу разработать что-нибудь, чтобы взять любой xsd и создать дерево, о котором я упоминал ранее.

Ответы [ 2 ]

1 голос
/ 07 июня 2012

В этой документации MSDN очень хорошо объясняется, как обходить схемы XML:

http://msdn.microsoft.com/en-us/library/ms255932.aspx

0 голосов
/ 02 июня 2011

Я не знаком с API-интерфейсом XmlSchema, на который вы ссылаетесь.

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

...