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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML как реестр. Запись и чтение как в реестр. 
:(
    Опции темы
iddqd
Дата 17.4.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Мой_Класс.Read("Путь_к_ноду_через_слеши_включая_аттрибуты");

Например:
Код

MyClass.Read(@"ProductionQuery\Query\Passport\Printable\PassportNumber");


Сейчас я чтение делаю примерно так:
Код

            XmlDocument XML = new XmlDocument();
            XML.Load(@"c:\Projects\Cardpas.NET\XMLMonster\XMLMon\1.xml");
            string path = @"ProductionQuery\Query\Passport\Printable\PassportNumber";
            string[] st = path.Split('\\');
            XmlNode node = XML[st[0]];
            for (int i = 1; i < st.Length; i++ )
            {
                node = node[st[i]];
            }
            Console.WriteLine(node.InnerText);


Теперь несколько нюансов.
Нормальный ли это подход в принципе или может в C# есть функции, которые принимают сразу последовательность для чтения?
Как реализовать чтение с аттрибутами, т.е. чтоб строка запроса выглядила вот так:
Код

@"ProductionQuery id=12\Query number=34\Passport\Printable\PassportNumber"

Т.е. есть разные ветвления нодов с разными аттрибутами id и number, например. С тем, как сделанно сейчас будет всегда читать первый нод.
Пожалуйста, посоветуйте реализацию, а то боюсь, что делаю очень сложными путями, а С# позволяет гораздно легче.



--------------------
PM MAIL   Вверх
tol05
Дата 17.4.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



есть XPath-выражения и метод XmlDocument.SelectSingleNode(string XPath-expression)
в выражении ставишь любые пути, любые значения аттрибутов.
http://www.raleigh.ru/TR/REC-xpath-19991116-ru.html

например так:
string name = "someone";
XmlDocument doc = ...
...
doc.SelectSingleNode("properties/property[@name='" + name + "']");


Это сообщение отредактировал(а) tol05 - 17.4.2007, 13:25


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
iddqd
Дата 17.4.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мда, не мало там читать и справка не лучшая.
Не подскажешь, как буде выглядеть XPath для такого выржения:
Код

"ProductionQuery id=12\Query number=34\Passport\Printable\PassportNumber"
?

И можно ли с использованием XPath записывать значения?

Добавлено через 2 минуты и 55 секунд
Если конкретно, то неочень понятно как передавать аттрибуты.

Добавлено через 6 минут и 50 секунд
Прошу прощения, забыл про такую прекрасну вещь, как гугл.
Но вопрос про запись остается открытым. И можно ли создать все ноды автоматически по этмоу пути?


--------------------
PM MAIL   Вверх
tol05
Дата 17.4.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



doc.SelectSingleNode("ProductionQuery[@id='12']/Query[@number='34']/Passport/Printable/PassportNumber");



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
iddqd
Дата 17.4.2007, 14:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, на вопрос про запись ответь, пожалуйста.
http://xml.nsu.ru/ - очень рекоммендую, суперский сайт про xml и все примыкающие технологии.


--------------------
PM MAIL   Вверх
iddqd
Дата 17.4.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



После прочтения некоторого кол-ва материалов по XPath мне кажется, что добавлять записи такими же способом 
(я имею в виду указанием полного пути) придется парсить строки и добавлять ноды по очереди :(
Или все же есть способ проще?


--------------------
PM MAIL   Вверх
tol05
Дата 17.4.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Извини, iddqd, зубы ездил лечить.
Я не очень большой специалист по Xml и XPath, если честно. Но думаю, что XPath используется для навигации, в конце концов ты все равно получаешь XmlElement или XmlNode, а в файл вообще записываешь XmlDocument (после того, как ты поизвращался с его XmlElement или XmlNode) smile
По поводу добавления записей в множество XmlNode-ов: насколько я помню, все равно нужно это множество получить и потом в цикле поизменять значения. Как в обычном потоке.

Так что если кто из спецов откликнется, то буду рад сам подучиться 
 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
iddqd
Дата 17.4.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел довольно интересную вещь, правда, она немного странно работает. Не всегда, казалось бы правильный, запрос подтверждает.
http://www.codeproject.com/csharp/xpathstore.asp


--------------------
PM MAIL   Вверх
iddqd
Дата 17.4.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Никак не получается заставить этот компонент больше одного параметра записывать :(
И как-то он иногда перезаписывает уже существующие ноды. Может кто-нибудь пояснить немного? А то опыта в c# мало :(


--------------------
PM MAIL   Вверх
Мурлыкатам_
Дата 11.4.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Если речь идет о неком конфигурировании, то можно использовать ConfigurationManager, который работает с хмл файлами.
Если нужно работать с произвольным хмл файлом, то можно сделать это с помощью XPathNavigator.
С проблемой записи не сталкивался. Но пологаю:

Код

XmlDocument doc = new XmlDocument(); // создаем хмл документ
doc.Load("doc to load"); // грузим в него хмл данные из потока... 3 варианта потоков
XmlWriter writer;             // создаем врайтер, который этот док без труда запишет куда надо. Тут надо его еще определить.
doc.WriteContentTo(writer); // и пишем... 


У мя статья в мсдн ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/WD_XML/html/1f8904f1-1900-44eb-9956-8fcfcbb0189c.htm
Или набери XmlWriter или в мсдн, или в гугле...

http://search.msdn.microsoft.com/Default.a...&lang=ru-ru

№1 в поиске по мсдн-у: http://msdn2.microsoft.com/en-us/library/4...2hb(vs.71).aspx

Это сообщение отредактировал(а) Мурлыкатам_ - 11.4.2008, 14:32


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
mr.DUDA
Дата 11.4.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Мурлыкатам_, на дату темы посмотрите...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 18.4.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



mr.DUDA, Зато сообщение ++;  smile   smile   smile 

Какая разница какая дата, если хоцацца оставить свой след в истории форума, мне ж тоже хочется 8000 сообщений набрать =))))))))
Но на все темы с 0 ответов не успеваешь... А тут тема помоему не закрыта, вдруг кто-то будет искать подобный вопрос, наткнется на решение, улыбнется и скажет спасибо винград! Что даже старые вопросы освещают и не оставляют без внимания, скока бы я еще мучался, если бы добрый мурлыкатам не оставил тут свой пост!!! 
А об этом вы подумали, многоуважаемый, mr.DUDA?  smile 

Это сообщение отредактировал(а) Мурлыкатам_ - 18.4.2008, 13:04


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

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


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

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


 




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


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

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