Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2014, 20:20   #1
LENA_M
Пользователь
 
Регистрация: 24.04.2009
Сообщений: 98
По умолчанию Parser XML как найти путь к нужному элементу

Добрый день,
у меня такой вопрос. Пытаюсь сделать простой парсер.
Когда пытаюсь вывести все элементы, все работает, как только пытаюсь задать путь до конкретного элемента выдает ошибку.
Вот мой XML файл
Код:
<?xml version="1.0" encoding="UTF-8" ?>
<root xmlns="defaultNS" xmlns:pref1="prefix1NS">
    <pref1:container xmlns:pref2="prefix2NS" attribute1="attrValue1" pref1:attribute2="attrValue2">
        <pref2:entryElement>
            <someData />
        </pref2:entryElement>
        <pref2:entryElement xmlns:pref2="prefix3NS">
            <moreData />
        </pref2:entryElement>
    </pref1:container>
</root>
Задаю путь до конкретного элемента как написано в учебнике

Код:
XmlDocument doc = new XmlDocument();
            doc.Load("XMLFile2.xml");
            XmlNode node = doc.SelectSingleNode("/root/container/entryElement");
            foreach (XmlNode node in doc.DocumentElement)
           {
...
            }
Не работает такой способ.
Как правильно написать?

Спасибо
LENA_M вне форума Ответить с цитированием
Старый 28.02.2014, 20:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
foreach (XmlNode node in doc.DocumentElement)
А чего так? Может
Код:
foreach (XmlNode inode in node){
 inode покажет на выбранные элементы
}
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.02.2014, 21:36   #3
LENA_M
Пользователь
 
Регистрация: 24.04.2009
Сообщений: 98
По умолчанию

И так тоже не работает...
Может у кого то есть еще какие нибудь идеи?
LENA_M вне форума Ответить с цитированием
Старый 28.02.2014, 21:45   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

читайте про xml неймспейсы
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.02.2014, 21:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

SelectSingleNode() сам вообще возврашаеть хоть набор? Или он тупо пустой набор выдает?
Кстати: LINQ to XML. Может попробовать через него стоит? LINQ всетки штука мощная.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.02.2014, 22:36   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
SelectSingleNode() сам вообще возврашаеть хоть набор? Или он тупо пустой набор выдает?
Кстати: LINQ to XML. Может попробовать через него стоит? LINQ всетки штука мощная.
боюсь от преобразования пространств имен все равно не спасет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.03.2014, 07:43   #7
mr_cipher
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 29
По умолчанию

Он возвращает не набор. А лишь единственный XmlNode.

Может попробовать так:

Код:
XmlNode singleNode1 = doc.SelectSingleNode("/root/pref1:container/pref2:entryElement");
XmlNode singleNode2 = doc.SelectSingleNode("/root/container/entryElement");
И проверить чему равно первое и второе. null не null.

MSDN говорит:
Цитата:
Если выражение XPath не содержит префикс, предполагается, что URI пространства имен является пустым пространством имен. Если XML включает пространство имен по умолчанию, необходимо по-прежнему использовать XmlNamespaceManager и добавить в него префикс и URI пространства имен; в противном случае, ни один узел не будет выбран.
И, исходя из выше сказанного, видимо, надо делать как-то так:
Код:
 XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
 nsmgr.AddNamespace("dflt", "defaultNS"); 
 nsmgr.AddNamespace("pref1", "prefix1NS");
 nsmgr.AddNamespace("pref2", "prefix2NS");
 XmlNode singleNode= doc.SelectSingleNode("/root/container/entryElement", nsmgr);

Последний раз редактировалось mr_cipher; 01.03.2014 в 07:47.
mr_cipher вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Array of ^Integer как подобраться к нужному индексу? WhiskasTM Общие вопросы Delphi 2 31.08.2012 12:08
Как найти путь к ApplicationData M-UNIT Общие вопросы Delphi 3 19.08.2010 15:44
Как присоединить список імён к нужному полю clanz Microsoft Office Access 2 27.02.2010 12:23
Как найти путь к файлу? Gawwws Microsoft Office Excel 6 05.12.2008 14:01
XML Parser Aynas Общие вопросы Delphi 3 09.08.2008 22:05