我正在尝试使用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的回复
答案 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)
您正在使用IXmlLineInfo
和msdn page:
提供一个接口,使类能够返回行和位置 信息。
可能是导致此错误的原因。我猜我没有使用yield return
返回任何内容(因为它永远不会被调用)并且使用item.MoveNext()
结果objXmlReader
移动到xml的最后一个元素会导致异常。
请注意,这只是基于您提供的数据的猜测。