XMLTextReader не читает содержимое элемента - PullRequest
6 голосов
/ 13 октября 2010
static void ReadXml()
{
    string a= null;
    double b= 0;
    double c= 0;
    XmlReader xmlReader = new XmlReader("Testxml.xml");
    xmlReader.
    using (xmlReader)
    {
        if (xmlReader != null)
        { 
            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    switch (xmlReader.Name)
                    {
                        case "a":
                            a = xmlReader.ReadElementContentAsString();

                            break;
                        case "b":
                            b = double.Parse(xmlReader.ReadElementContentAsString());

                            break;
                        case "c":
                            c = double.Parse(xmlReader.ReadElementContentAsString());

                            break;
                    }
                }
            }
        }
    }
}

Содержимое TestXML:

<a><b>26a83f12c782</b><c>128</c><d>12</d></a>

Случай b никогда не срабатывает. Но если я добавлю пробел после конечного элемента b, случай b попадет. Теперь, как заставить это работать без изменения файла XML?

1 Ответ

10 голосов
/ 13 октября 2010

Вот рабочая версия вашего кода.Исправлены следующие конкретные проблемы:

  1. new XmlReader не компилируется .Это абстрактный класс.Вам необходимо использовать XmlTextReader или другой XmlReader производный класс.

  2. b не является допустимым двойным .Вы пытались преобразовать большое шестнадцатеричное число в двойное, что невозможно.Вы можете использовать NumberStyles.HexNumber в вызове Parse, но не с double, это должно быть long или int.

  3. Double read .Вы вызывали Read() внутри цикла, но затем также использовали методы XmlReader.ReadXxx().Это вызывало чтение лишних раз и пропуск узлов.Это действительно основная проблема, о которой вы спрашивали.Следующий код отслеживает последний найденный элемент и ожидает его обработки до узла Text.Это хорошо для простых / простых документов, но для более сложных вам нужен лучший способ отслеживания состояния, такой как конечный автомат.Или используйте DOM.Или LINQ.

    static void ReadXml()
    {
        string a = null;
        long b = 0;
        double c = 0;
        string text = "<a><b>26a83f12c782</b><c>128</c><d>12</d></a>";
        string element = "";
    
    
    <pre><code>using (XmlReader xmlReader = new XmlTextReader(new StringReader(text)))
    {
        while (xmlReader.Read())
        {
            if (xmlReader.NodeType == XmlNodeType.Element)
            {
                element = xmlReader.Name;
            }
            else if (xmlReader.NodeType == XmlNodeType.Text)
            {
                switch (element)
                {
                    case "a":
                        a = xmlReader.Value;
                        Console.WriteLine("a: " + a);
                        break;
                    case "b":
                        b = long.Parse(xmlReader.Value, NumberStyles.HexNumber);
                        Console.WriteLine("b: " + b);
                        break;
                    case "c":
                        c = double.Parse(xmlReader.Value);
                        Console.WriteLine("c: " + c);
                        break;
                }
            }
        }
    }
    
    }
...