Вопрос

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

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

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

Это на C # 2.0 с .NET 2.0.

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

Действительно обходной (но бесплатный) способ, которым вы могли бы воспользоваться.Можно использовать СЕТЕВЫЕ инструменты, которые существуют на вашем компьютере xsd.exe (Ссылка) для создания объектов entity, которые определяет ваша схема, используйте следующее:

xsd /classes /language:CS XSDSchemaFile.xsd

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top