Создание xml-файла из xsd в .NET - PullRequest
5 голосов
/ 30 апреля 2009

Хотелось бы узнать лучший способ решения этой проблемы: Я хотел бы создать пустой шаблон XML из схемы XML. Все необходимые элементы и атрибуты будут созданы, а их значения будут пустыми строками.

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 01 мая 2009

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

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

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

1 голос
/ 01 мая 2009

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

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

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

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

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

0 голосов
/ 01 мая 2009

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

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

xsd /classes /language:CS XSDSchemaFile.xsd

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...