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


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



Код

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 структуре только буквы, то всё работает

Автор: mr.DUDA 16.11.2005, 22:04
Проблема в данном случае достаточно трививальная: код сваливается на строке "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-е. При наличии ошибок, браузер покажет строку, содержащую ошибку и укажет причину ошибки.

Автор: Riccon 17.11.2005, 02:06
Понял, спасибо!

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