xmlTextReader.ReadInnerXml() извлекает весь мой XML-документ в одну переменную

Я создаю индексные файлы XML для чтения на более позднем этапе. У меня есть массивы переменной длины, и я пишу их в один файл.

Есть проблема, я думаю, она внутри кода ридера. По какой-то причине элементы TimeStamp и Long считываются в массивы корректно, а элементы Lat и VideoFile пропускаются. По какой-то причине их reader.nodetype никогда не возвращается. Единственный способ, которым метод read() подбирает их, - это тип узла TEXT, а затем он показывает только значение innerxml, что для меня бесполезно.

Приведенный ниже код должен быть полностью работоспособным после сохранения примера XML-файла.

Еще раз спасибо пользователям стека.

Творчество

    using System.Xml;        
    XmlTextWriter xmlwriter = new XmlTextWriter(file, null);
    xmlwriter.Formatting = Formatting.Indented;
    //xmlwriter.Indentation = 4;
    xmlwriter.WriteStartDocument();
    xmlwriter.WriteStartElement("Index");

    for (int i = 0; i < malLat.Count; i++)
    {
        xmlwriter.WriteStartElement("Marker");

        xmlwriter.WriteStartElement("TimeStamp");
        xmlwriter.WriteString(malTimes[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("Lat");
        xmlwriter.WriteString(malLat[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("Long");
        xmlwriter.WriteString(malLong[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("VideoFile");
        xmlwriter.WriteString(malVideoTitle[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteEndElement();
    }
    xmlwriter.WriteEndElement();
    xmlwriter.WriteEndDocument();
    xmlwriter.Close();

Чтение

using System.Xml;  
XmlTextReader lxmlReader = new XmlTextReader(mstrIndexFile + ".xml");
lxmlReader.WhitespaceHandling = WhitespaceHandling.None;

while (lxmlReader.Read())
{
    if (lxmlReader.NodeType == XmlNodeType.Element)
    {
        if (lxmlReader.Name == "TimeStamp")
        {
            malTimes.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "Lat")
        {
            malLat.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "Long")
        {
            malLong.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "VideoFile")
        {
            malVideoTitle.Add(lxmlReader.ReadInnerXml().ToString());
        }
    }
}

lxmlReader.Close();

Образец XML-документа

    <Index>
      <Marker>
        <TimeStamp>2011-7-17 23:18:39</TimeStamp>
        <Lat>-121.261953323166</Lat>
        <Long>43.0594755392741</Long>
        <VideoFile>C:\Users\kpenner\Desktop\Video Dev\1_1.wmv</VideoFile>
      </Marker>
      <Marker>
        <TimeStamp>2011-7-17 23:18:40</TimeStamp>
        <Lat>-122.260755</Lat>
        <Long>46.05878</Long>
        <VideoFile>C:\Users\kpenner\Desktop\Video Dev\1_1.wmv</VideoFile>
      </Marker>
    </Index>

person kevp    schedule 08.05.2012    source источник
comment
lxmlReader.WhitespaceHandling = WhitespaceHandling.All;   -  person kevp    schedule 08.05.2012


Ответы (1)


Проблема, связанная с тем, что XmlTextReader является средством чтения только вперед. Когда вы выполняете ReadInnerXml для средства чтения на конечном узле, оно переходит к следующему элементу (см. http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readinnerxml.aspx). Таким образом, в этом случае, когда вы нажимаете TimeStamp и выполняете ReadInnerXml, читатель затем перемещает к типу Lat Element, потому что эти 4 элемента являются конечными узлами. Затем вы снова читаете в своем цикле while, который перемещает читатель к текстовому элементу Lat. Поскольку вы проверяете только типы элементов, это работает до тех пор, пока вы не нажмете Long, который затем сломает VideoFile по тем же причинам.

Вот ссылка на другой вопрос SO с ответом, который может помочь с вашим решением: XMLTextReader not чтение содержимого элемента.

person Josh    schedule 08.05.2012