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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML & C#, Работа с XPathNavigator 
:(
    Опции темы
Riccon
Дата 16.11.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Парни, подскажите плиз, почему нехочет работать такой код:
Смысл фичи получить значение находящиеся по указанному пути.



Код

using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;

namespace ConsoleApplication5
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            start();    
        }
        static void start()
        {
            XmlDocument doc = new XmlDocument();
            
            String xmlData = "<data>" +
                "<100>" +
                "<#0>" +
                "<a>Алексеев В.А.</a>" +
                "</#0>" +
                "</100>" +
                "<245>" +
                "<#0>" +
                "<a>Иллюзии и догмы</a>" +
                "<b>Взаимоотношения Советского государства и религии</b>" +
                "</#0>" +
                "</245>" +
                "</data>";

            doc.InnerXml = xmlData;
            XPathNavigator nav = doc.CreateNavigator();
            Console.WriteLine(getData(nav,"descendant::100/a"));
        }
        
        static string getData(XPathNavigator nav, String path )
        {
            Convert.ToString(path);
            XPathNodeIterator myIterator =  nav.Select(path);
            myIterator.MoveNext();
            return myIterator.Current.Value;        
        }
    }
}


Если в XML структуре только буквы, то всё работает
PM MAIL   Вверх
mr.DUDA
Дата 16.11.2005, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Проблема в данном случае достаточно трививальная: код сваливается на строке "doc.InnerXml = xmlData", по причине некорректно отформатированной XML-строки. Более конкретно причину ошибки можно узнать, если заключить этот фрагмент кода в try...catch и просмотреть текст исключения:

Цитата
The '1' character, hexadecimal value 0x31, cannot begin with a name. Line 1, position 47.


XML-тэги не могут начинаться с цифры и не могут содержать символ "#". Далее, если исправить эти ошибки в XML-коде, то вылетает исключение в getData():

Цитата
The expression passed to this method should result in a NodeSet.


Это исключение вылетает из-за того, что в коде выполняется попытка получить XML-тэг по XPath-пути "100/a". Тэг "100" не может существовать по вышеописанным причинам.

Окончательный, откорректированный и рабочий вариант программы:

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

namespace ConsoleApplication5
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            start(); 
        }

        static void start()
        {
            XmlDocument doc = new XmlDocument();

            String xmlData = 
                "<data>" +
                "<a100>" +
                "<n0>" +
                "<a>Алексеев В.А.</a>" +
                "</n0>" +
                "</a100>" +
                "<x245>" +
                "<n0>" +
                "<a>Иллюзии и догмы</a>" +
                "<b>Взаимоотношения Советского государства и религии</b>" +
                "</n0>" +
                "</x245>" +
                "</data>";

            doc.InnerXml = xmlData;
            XPathNavigator nav = doc.CreateNavigator();
            Console.WriteLine(getData(nav,"descendant::a100/a"));
        }

        static string getData(XPathNavigator nav, String path )
        {
            Convert.ToString(path);
            XPathNodeIterator myIterator = nav.Select(path);
            myIterator.MoveNext();
            return myIterator.Current.Value; 
        }
    }
}


P.S. проверить корректность любого XML-документа можно довольно простым способом: создав текстовый файл с XML-содержимым и сохранив его под расширением .xml, а затем открыв в Internet Explorer-е. При наличии ошибок, браузер покажет строку, содержащую ошибку и укажет причину ошибки.


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


Шустрый
*


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

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



Понял, спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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