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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как представить граф в XML? 
V
    Опции темы
alir
Дата 30.11.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Задача такая: представить в XML'е граф, считать его и изобразить на форме. Как лучше представить вершины и связи в XML-файле - хранить названия вершин и информацию с какими еще вершинами связан? Просто насколько я знаю в XML в основном хранят информацию в древовидной структуре, а мне нужно чтобы любой узел мог быть связан с любым другим. Как лучше сделать?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 30.11.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Связь можно сделать так: хранить путь XPath на связанный XML-узел. Тогда выбрать узел можно с пом. обычного XPathNavigator-а.


--------------------
user posted image
PM MAIL WWW   Вверх
alir
Дата 1.12.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mr.DUDA
Простенький примерчик плз, а то в XML знаком только с основами.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 1.12.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



alir, пожалуйста:

Код
using System;
using System.Xml;
using System.Xml.XPath;

class Program
{
    static void Main()
    {
        string xml = @"<root>
    <MyNode id=""1"">
        <value>bla-bla-bla node</value>
        <MyNode id=""8"">
            <some />
            <ref path=""//MyNode[@id='3']""/>
        </MyNode>
    </MyNode>
    <MyNode id=""2"">
        <ref path=""//MyNode[@id='1']""/>
        <value>another node</value>
        <MyNode id=""9"">
            <ref path=""//MyNode[@id='8']""/>
            <cool />
        </MyNode>
    </MyNode>
    <MyNode id=""3"">
        <ref path=""//MyNode[@id='1']"" />
        <ref path=""//MyNode[@id='2']"" />
        <value>third node</value>
    </MyNode>
</root>";


        // загрузим этот XML и проанализируем ссылки между узлами
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNode root = doc.ChildNodes[0];
        foreach (XmlNode myNode in root.ChildNodes)
            DumpNodeReferences(myNode);
    }

    static void DumpNodeReferences(XmlNode myNode)
    {
        // перечисляем ссылки на др. узлы
        foreach (XmlNode refNode in myNode.ChildNodes)
        {
            if (refNode.Name != "ref") continue;

            // получаем узел, на который ведёт ссылка
            string path = refNode.Attributes["path"].InnerText;
            XmlNode refTarget = myNode.OwnerDocument.SelectSingleNode(path);

            Console.WriteLine("Узел Id={0} ссылается на узел Id={1}",
                myNode.Attributes["id"].Value, refTarget.Attributes["id"].Value);
        }

        // дёргаем этот же метод рекурсивно для вложенных <MyNode>-узлов
        foreach (XmlNode childNode in myNode.ChildNodes)
            DumpNodeReferences(childNode);
    }
}


Любой узел <MyNode> может ссылаться на любое количество других узлов <MyNode>.
Ссылка описывается тегом <ref>.

Разумеется, имена тегов и атрибутов могут быть произвольными.


--------------------
user posted image
PM MAIL WWW   Вверх
alir
Дата 1.12.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mr.DUDA
Благодарю за пример.
А зачем делать вложенные узлы MyNode? Как я понимаю, в моей задаче достаточно оперделения узла и ссылок с какими узлами связан, т.е. так:
Код

<MyNode id=""1"">
        <ref path=""//MyNode[@id='2']""/>
    </MyNode>
    <MyNode id=""2"">
        <ref path=""//MyNode[@id='3']""/>
        <ref path=""//MyNode[@id='4']""/>
    </MyNode>
    <MyNode id=""3"">
        <ref path=""//MyNode[@id='5']""/>
        <ref path=""//MyNode[@id='2']""/>
    </MyNode>
    <MyNode id=""4"">
        <ref path=""//MyNode[@id='2']""/>
    </MyNode>
    <MyNode id=""5"">
        <ref path=""//MyNode[@id='3']""/>
    </MyNode>

Далее, что за теги <some />, <cool /> и <value>? Вроде ж без них можно.

И еще: подскажи как скачать этот граф из xml-файла? Т.е. необходимо не просто считать в string-переменную, а использовать специализированные методы (соотвественно для этого примера).
PM MAIL ICQ   Вверх
mr.DUDA
Дата 2.12.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(alir @  1.12.2006,  19:49 Найти цитируемый пост)
А зачем делать вложенные узлы MyNode? Как я понимаю, в моей задаче достаточно оперделения узла и ссылок с какими узлами связан, т.е. так:

Вложенные узлы можно убрать, тут у меня получилось скорее дерево+ссылки а не граф в чистом виде; хотя, поиск по вложенным узлам провести быстрее чем по ссылкам. А одинаковые имена - чтобы не запутаться. В принципе я же говорил, что имена тегов и атрибутов (id и так далее) чисто условные, можно юзать хоть 10 разных тегов и ссылок между ними, главное правильно указывать имя конкретного тега в xpath и в коде.

Цитата(alir @  1.12.2006,  19:49 Найти цитируемый пост)
Далее, что за теги <some />, <cool /> и <value>? Вроде ж без них можно.

Ну куда же без <cool>, <value> и <some> ?  smile 
Воткнул их для примеру, чтоб MyNode хоть что-нибудь кроме ссылок содержали.

Цитата(alir @  1.12.2006,  19:49 Найти цитируемый пост)
И еще: подскажи как скачать этот граф из xml-файла? Т.е. необходимо не просто считать в string-переменную, а использовать специализированные методы (соотвественно для этого примера).

XmlDocument можно загрузить методом Load из любого стрима. FileStream подойдёт. Потом можно завернуть XmlDocument в класс с методами типа GetNodeById, AddReference, GetInRefs/GetOutRefs и так далее.


--------------------
user posted image
PM MAIL WWW   Вверх
alir
Дата 5.12.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mr.DUDA
Ок, спасибо за помощь.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 5.12.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



alir, всегда пожалуйста  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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