2009-04-30 4 views
5

Я хотел бы знать лучший метод для решения этой проблемы: Я хотел бы создать пустой шаблон xml из схемы xml. Все необходимые элементы и атрибуты будут созданы, а их значения будут пустыми.Создание xml-файла из xsd в .NET

Следующий шаг - определить, какие дочерние узлы xml могут иметь определенные узлы. например. Я бы выбрал узел имеет minOccurs = «0», maxOccurs = «неограниченный» для одного из своих дочерних элементов. Я смог бы определить все об этом ребенке, его атрибутах, его имени, его значении типа и т. Д.

Чтобы получить больше информации о ситуации, я работаю над инструментом, который позволяет пользователям редактировать xml-файлы в более удобная для пользователя настройка. Например, они могут добавить новую учетную запись к узлу «account db», и они увидели бы, что единственным доступным узлом является узел учетной записи. Затем, когда они пытаются добавить детей к узлу учетной записи, и выбор будет иметь имя узла (обязательно), узел пароля (обязательно), узел настроек (необязательно) и т. Д. Как определить программно, какие дочерние узлы учетной записи доступны это и какие атрибуты и настройки для этих детей?

Это в C# 2.0 с .NET 2.0.

Итак, какие классы я использую для чтения схемы и ее анализа, чтобы получить полезную информацию для создания xml? В моей наивности я надеялся, что, поскольку xsd был xml сам по себе, была бы какая-то модель DOM, через которую я мог бы пройти.

Я хотел бы, чтобы это было ограничено моей программе так не использование внешних инструментов, таких как OxygenXml, VS, Xsd.exe и т.д.

+1

Возможный дубликат [Есть ли класс для создания образца XML-документа из схемы XSD в .NET] (http://stackoverflow.com/questions/41674/is-there-a-class-to-generate-a -sample-xml-document-from-xsd-schema-in-net) –

ответ

1

Похоже, что то, что вы хотите сделать, реплицирует функции XML intellisense в большинстве хороших редакторов XML. т.е. прочитайте схему xml и определите, какие элементы и атрибуты могут появиться дальше.

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

В основном вам необходимо загрузить XSD (объекты XmlSchema в .net позволяют это сделать). Но объектная модель SOM, которую они выставляют, очень сырая, поэтому вам нужно сделать много работы, чтобы ее интерпретировать. Если вы игнорируете такие понятия, как группы подстановок, расширение complexType, схемы хамелеона и namesapces, вы должны легко перемещаться по ЗВОЛу.

Вам нужно выяснить, где вы находитесь в документе XML, относительно вашей схемы. Как только вы узнали, что вы в SOM, вы можете приступить к разработке доступных вариантов.

Для этого необходимо 1000 строк строк и 4-12 человеко-недель работы. Вы можете получить что-то общее вместе через несколько недель?

+0

Да, это то, что я открываю, когда я начал работать над этим. Для создания библиотеки для этого действительно потребуется много часов. Я смирился с тем, чтобы пересечь объект XmlSchema и собирать и извлекать информацию, которая мне нужна в это время. – ipwnponies

0

вы можете использовать сторонний инструмент, такой как XMLSpy (link). он сделает фиктивный xml от xsd или наоборот.

Действительно карусель (но бесплатно), как вы могли бы сделать с .NET инструментами, которые существуют на вашем компьютере будет использовать xsd.exe (link) для создания объектов объекта, который ваша схема определяет, используя следующую:

xsd /classes /language:CS XSDSchemaFile.xsd 

Затем, когда у вас есть объекты, загрузите их в проект и выполните сериализацию. Вы можете заполнить свойства и, если хотите добавить некоторые фиктивные данные.

+0

Извините, что, не указав это, я хочу, чтобы это выполнялось исключительно в рамках моей программы. Самая важная информация, которую я хотел, это метод или класс, которые позволили бы мне разобрать схему для любой информации, которая мне нужна. – ipwnponies

1

Я сдавал глаза с документами MSDN, и я думаю, что я взял запах. Загрузите схему с помощью XmlSchema.Read и скомпилируйте ее. Свойство Elements будет содержать коллекцию элементов верхнего уровня. Вам придется жестко указать квалифицированное имя корневого элемента или что-то еще. Тогда все. Я еще не нашел, как найти «содержимое» в рамках данного элемента схемы.

Редактировать: Я нашел еще несколько путей, но все еще не кристально ясно. XmlSchemaElements имеет свойство типа схемы. Это просто или сложно. Сложные типы в xml-схеме могут иметь атрибуты, последовательности, группы и т. Д. Последовательности имеют свойство, называемое частицей, которая может быть элементом. И цикл повторяется. Но я думаю, что сложная часть реализации будет заключаться в том, чтобы вы охватывали все возможные случаи (простой тип, сложный тип с атрибутом, сложный тип с атрибутом и элементами, расширения, весь shebang).

Редактировать: Используйте свойство Element объекта XmlSchema для получения XmlSchemaElement. Используйте свойство SchemaType XmlSchemaElement для получения простого или сложного типа. Используйте свойство Attribute XmlSchemaComplexType, чтобы получить атрибуты или ContentModel, чтобы получить «простой контент»/«сложный контент» или «Particle», чтобы получить «последовательность»/«выбор»/«все».В основном много перемещающихся свойств и проверка типов и объектов литья слева и справа и проверка всех возможных аранжировок объектов xsd. Создание библиотеки было бы длинным и громоздким и подверженным ошибкам. И это с xml-схемами, с dtds я даже не хочу начинать думать. Вау, схемы xml необходимы, но почему они должны быть такими злыми.

Смежные вопросы