Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > XML как реестр.


Автор: iddqd 17.4.2007, 13:13
Довольно давно я это реализовывал в дельфи. Сейчас появилась необходимость сделать то же самое в 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, например. С тем, как сделанно сейчас будет всегда читать первый нод.
Пожалуйста, посоветуйте реализацию, а то боюсь, что делаю очень сложными путями, а С# позволяет гораздно легче.

Автор: tol05 17.4.2007, 13:23
есть 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 + "']");

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

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

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

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

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

Автор: tol05 17.4.2007, 14:06
doc.SelectSingleNode("ProductionQuery[@id='12']/Query[@number='34']/Passport/Printable/PassportNumber");

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

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

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

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

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

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

Автор: Мурлыкатам_ 11.4.2008, 14:11
Если речь идет о неком конфигурировании, то можно использовать 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.aspx?query=writing+xml&brand=msdn&locale=ru-ru&refinement=&lang=ru-ru

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

Автор: mr.DUDA 11.4.2008, 15:32
Мурлыкатам_, на дату темы посмотрите...  smile 

Автор: Мурлыкатам_ 18.4.2008, 13:00
mr.DUDA, Зато сообщение ++;  smile   smile   smile 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)