Моя конечная цель состоит в том, чтобы просмотреть документ 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 и создать дерево, о котором я упоминал ранее.