Проблема со ссылкой на объект при достижении конца строки XML - PullRequest
0 голосов
/ 25 августа 2009

Я разработал небольшой xml-анализатор для конкретного файла с такой структурой данных:

<questionnaire type="Echo">
    <quest etat="0" ord="0">
        <intro>
            <t>bla bla bla</t>
        </intro>
        <rep1>
            <t>word</t>
            <ev id="Q0R1"/>
        </rep1>
        <rep2>
            <t>word</t>
            <ev id="Q0R2"/>
        </rep2>
    </quest>
</questionnaire>

Тег <quest></quest> фактически повторяется 70 раз.

Вот синтаксический анализатор, который я разработал на C # и который принимает параметр "xmlString", содержащий XML, для анализа:

XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(xmlString));

while(reader.ReadToFollowing("quest"))
{
    Console.WriteLine("=================================");

    Console.WriteLine("ID : " + reader.GetAttribute("ord").ToString());

    reader.ReadToFollowing("intro");
    reader.ReadToFollowing("t");
    Console.WriteLine("TEXTE : " + reader.ReadString());

    reader.ReadToFollowing("rep1");
    reader.ReadToFollowing("t");
    Console.WriteLine("REPONSE1 : " + reader.ReadString());
    reader.ReadToFollowing("ev");
    Console.WriteLine("CLE1 : " + reader.GetAttribute("id").ToString());

    reader.ReadToFollowing("rep2");
    reader.ReadToFollowing("t");
    Console.WriteLine("REPONSE2 : " + reader.ReadString());
    reader.ReadToFollowing("ev");
    Console.WriteLine("CLE2 : " + reader.GetAttribute("id").ToString());

    Console.WriteLine("ETAT : False");
}

Все в порядке в первом 69-м , но при достижении 70-го поля TEXTE и REPONSE1 пустые и проходят через NullReferenceException в строке:

Console.WriteLine("CLE1 : " + reader.GetAttribute("id").ToString());

Может кто-нибудь сказать мне, что не так ?? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 августа 2009

Почему вы не используете XPath?

XPathDocument doc = new XPathDocument("sample.xml");
var navigator = doc.CreateNavigator();
var iterator = navigator.Select("/questionnaire/quest");
while (iterator.MoveNext())
{
    Console.WriteLine("=================================");

    Console.WriteLine("ID : " + iterator.Current.GetAttribute("ord", String.Empty));
    var intro = iterator.Current.Select("intro/t");
    if (intro.MoveNext())
    {
        Console.WriteLine("TEXTE : " + intro.Current.Value);
    }

    var response1 = iterator.Current.Select("rep1/t");
    if (response1.MoveNext())
    {
        Console.WriteLine("REPONSE1 : " + response1.Current.Value);
    }

    var cle1 = iterator.Current.Select("rep1/ev/@id");
    if (cle1.MoveNext())
    {
        Console.WriteLine("CLE1 : " + cle1.Current.Value);
    }

    var response2 = iterator.Current.Select("rep2/t");
    if (response2.MoveNext())
    {
        Console.WriteLine("REPONSE2 : " + response2.Current.Value);
    }

    var cle2 = iterator.Current.Select("rep2/ev/@id");
    if (cle2.MoveNext())
    {
        Console.WriteLine("CLE2 : " + cle2.Current.Value);
    }

    Console.WriteLine("ETAT : False");
}
0 голосов
/ 26 августа 2009

GetAttribute возвращает ноль, если атрибут не существует для текущего узла. Таким образом, выполнение ToString () для нулевого объекта создает исключение NullReferenceException .

Чтобы исправить это, проверьте нулевое значение перед выполнением ToString ().

Кстати, GetAttribute уже возвращает строку, поэтому вызывать ToString довольно бесполезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...