节点类型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用于您的回复
问题的主要原因是您使用了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的最后一个元素,从而导致异常。
请注意,这只是基于您提供的数据的猜测。