节点类型EndElement不支持ReadElementContentAsString方法

本文关键字:ReadElementContentAsString 方法 不支持 EndElement 类型 节点 | 更新日期: 2023-09-27 17:58:44

我正在尝试使用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用于您的回复

节点类型EndElement不支持ReadElementContentAsString方法

问题的主要原因是您使用了ReadElementContentAsString,它将"光标"移动到您正在读取的元素之后的,但您随后再次调用Read()

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

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

如果您位于first元素的开口上,则ReadElementContentAsString会将读取器移动到second元素的开头。然后调用Read(),它将移动到文本节点("Bar")中。当您第二次调用ReadElementContentAsString时,它将失败,因为您不在元素起始节点上。然而,我希望得到一个例外:

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

而由于某种原因,您得到了EndElement的节点类型。

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

您使用的是IXmlLineInfo,并且来自msdn页面:

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

这可能是该错误的原因。我猜使用yield return不会返回任何内容(因为它从未被调用),而使用item.MoveNext()会导致objXmlReader移动到xml的最后一个元素,从而导致异常。

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

相关文章:
  • 没有找到相关文章