节点类型EndElement不支持ReadElementContentAsString方法

时间:2013-02-12 13:25:01

标签: c# xml winforms

我正在尝试使用XmlTextReader类读取xml文件,我的xml文件是

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<AppXmlLogWritter>
<LogData><LogID>999992013021213232800001</LogID><LogDateTime>20130212132328</LogDateTime><LogType>Message</LogType><LogFlag>Flag</LogFlag><LogApplication>Application</LogApplication><LogModule>Module</LogModule><LogLocation>Location</LogLocation><LogText>Text</LogText><LogStackTrace>Stacktrace</LogStackTrace></LogData>
</AppXmlLogWritter>

使用以下代码

FileStream fileStream = File.Open(txtBrowseFilePath.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
             using (XmlTextReader objXmlReader = new XmlTextReader(fileStream))
{
                IEnumerable<LogData> data = LogData.GetLogData(objXmlReader);

                using(var item = data.GetEnumerator())
                {
                    while (item.MoveNext())
                    {
                        DataRow dataRow;
                        dataRow = dataTable.NewRow();

                        dataRow[0] = item.Current.LogID;
                        dataRow[1] = item.Current.LogDateTime;
                        dataRow[2] = item.Current.LogType;
                        dataRow[3] = item.Current.LogFlag;
                        dataRow[4] = item.Current.LogApplication;
                        dataRow[5] = item.Current.LogModule;
                        dataRow[6] = item.Current.LogLocation;
                        dataRow[7] = item.Current.LogText;
                        dataRow[8] = item.Current.LogStackTrace;

                        dataTable.Rows.Add(dataRow);
                    }
                }}
public static IEnumerable<LogData> GetLogData(XmlTextReader objXmlReader)
        {
            LogData objLogData = null;
            IXmlLineInfo xmlInfo = (IXmlLineInfo)objXmlReader;
            while(objXmlReader.Read())
            {


                if(objXmlReader.IsStartElement("LogData"))
                {
                    objLogData = new LogData();
                }
                if(objXmlReader.Name == "LogData" && objXmlReader.NodeType == XmlNodeType.EndElement)
                {
                    yield return objLogData;
                }
                if(objXmlReader.Name == "LogID")
                {
                    objLogData.LogID = objXmlReader.ReadElementContentAsString();
                }
                else if (objXmlReader.Name == "LogDateTime")
                {          
                    objLogData.LogDateTime = objXmlReader.ReadElementContentAsString();                   
                }
                else if(objXmlReader.Name == "LogType")
                {
                    objLogData.LogType = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogFlag")
                {
                    objLogData.LogFlag = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogApplication")
                {
                    objLogData.LogApplication = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogModule")
                {
                    objLogData.LogModule = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogLocation")
                {
                    objLogData.LogLocation = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogText")
                {
                    objLogData.LogText = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogStackTrace")
                {
                    objLogData.LogStackTrace = objXmlReader.ReadElementContentAsString();
                }
            }
        }

但它给我一个错误“节点类型EndElement不支持ReadElementContentAsString方法” 但当我的xml文件为

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AppXmlLogWritter>
<LogData>
<LogID>999992013021110381000001</LogID>
<LogDateTime>20130211103810</LogDateTime>
<LogType>Message</LogType>
<LogFlag>Flag</LogFlag>
<LogApplication>Application</LogApplication>
<LogModule>Module</LogModule>
<LogLocation>Location</LogLocation>
<LogText>Text</LogText>
<LogStackTrace>Stacktrace</LogStackTrace>
</LogData>
</AppXmlLogWritter>

它的工作正常,但我还没有得到abouve xml文件的实际问题为什么它给我一个错误,因为我的意思。此行发生错误

 objLogData.LogDateTime = objXmlReader.ReadElementContentAsString();  

Thnkx的回复

2 个答案:

答案 0 :(得分:2)

嗯,问题的主要原因是你正在使用ReadElementContentAsString在你正在阅读的元素之后将“光标”移动到 - 但是你正在调用再次Read()

所以当XML数据是这样的时候:

<first>Foo</first><second>Bar</second>

...如果您位于first元素开头,那么ReadElementContentAsString会将读者移到second元素的开头。然后调用移动到文本节点(“Bar”)的Read()。然后,当您第二次调用ReadElementContentAsString时,这将失败 - 因为您不在元素开始节点上。但是,我希望得到一个例外:

Unhandled Exception: System.InvalidOperationException:
The ReadElementContentAsString method is not supported on node type Text.

...但由于某种原因,您的节点类型为EndElement

你应该深入研究为什么会发生这种情况(例如,你在调试时是否手动调用Read?)但是你需要解决的根本问题是当你不需要时调用Read()

答案 1 :(得分:0)

您正在使用IXmlLineInfomsdn page

  

提供一个接口,使类能够返回行和位置   信息。

可能是导致此错误的原因。我猜我没有使用yield return返回任何内容(因为它永远不会被调用)并且使用item.MoveNext()结果objXmlReader移动到xml的最后一个元素会导致异常。

请注意,这只是基于您提供的数据的猜测。