Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XSD - схема в виде дерева 
V
    Опции темы
m9yt
Дата 29.4.2013, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Добрый день. Нужно представить xsd - схему в виде дерева, как показано на рисунке.
Есть идеи?
user posted image
PM MAIL   Вверх
m9yt
Дата 29.4.2013, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Неужели ни у кого нет соображений, как заполнить обычный TreeView данными из схемы?
PM MAIL   Вверх
diadiavova
Дата 30.4.2013, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Тут проблема не в том, чтобы отобразить в тривью, а в том, что структура дерева слева не совпадает со структурой схемы. Там пропущено много узлов, типа сиквенс, комплекстайп, экстеншн и прочее. Для начала надо бы привести схему к той структуре, которую ты собираешься отобразить. Если ты хочешь в точности повторить структуру, но при этом отображать только элементы и атрибуты, ну, возможно, еще несколько узлов, то можно обойтись без преобразования и попытаться запихнуть схему в тривью напрямую, хотя все равно идея - так себе. В ином случае для преобразования можно использовать XSLT, он для этих целей как раз и существует. А когда у тебя будет хмл, структура которого точно совпадает с желаемой структурой дерева, то там документ просто надо обойти рекурсивно и построить такое же дерево из узлов тривью, эта задача простая. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 30.4.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Код

private void createTree_Click(object sender, EventArgs e)
        {
            TraverseSOM(xsdPath.Text);
        }

        private static XmlSchema ReadAndCompileSchema(string fileName)
        {
            XmlTextReader tr = new XmlTextReader(fileName, new NameTable());

            XmlSchema schema = XmlSchema.Read(tr,
                   new ValidationEventHandler(ValidationCallbackOne));
            tr.Close();

            XmlSchemaSet xset = new XmlSchemaSet();
            xset.Add(schema);
            xset.Compile();

            return schema;
        }

        private static void ValidationCallbackOne(object sender, ValidationEventArgs args)
        {
            Console.WriteLine("Exception Severity: " + args.Severity);
            Console.WriteLine(args.Message);
        }

        private void TraverseSOM(string xsfFilename)
        {
            XmlSchema custSchema = ReadAndCompileSchema(xsfFilename);

            foreach (XmlSchemaElement elem in custSchema.Elements.Values)
            {
                TreeNode rootNode = ProcessElement(elem);
                treeView.Nodes.Add(rootNode);
            }
        }

        private TreeNode ProcessElement(XmlSchemaElement element)
        {
            TreeNode node = new TreeNode(element.Name);

            XmlSchemaComplexType ct = element.ElementSchemaType as XmlSchemaComplexType;

            if (ct != null)
            {
                // Обработка вложенных элементов
                XmlSchemaSequence sequence =
                    ct.ContentTypeParticle as XmlSchemaSequence;

                if (sequence != null)
                {
                    for (int i = 0; i < sequence.Items.Count; ++i)
                    {
                        XmlSchemaElement child =
                            sequence.Items[i] as XmlSchemaElement;

                        if (child != null)
                        {
                            TreeNode childNode = ProcessElement(child);

                            node.Nodes.Add(childNode);
                        }
                    }
                }

                // Обработка атрибутов
                foreach (DictionaryEntry obj in ct.AttributeUses)
                {
                    node.Nodes.Add((obj.Value as XmlSchemaAttribute).Name);
                }
            }

            return node;
        }

user posted image

Это сообщение отредактировал(а) m9yt - 30.4.2013, 14:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.