我正在使用ASP.NET,并从表单导入XML文件。现在我将其转换为Stream
:
Stream inputStream = XmlFileUploadControl.PostedFile.InputStream;
因为我以后可能需要此版本。
我想首先检查以确保XML文件格式正确,如果是,则显示一些信息:
if (CorrectFileFormat(inputStream))
{
DisplayLicenseInfo(inputStream);
}
else
{
StatusLabel.Text = "Selected file is not a LicensingDiag XML file";
}
CorrectFileFormat()
方法:
protected Boolean CorrectFileFormat(Stream inputStream)
{
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "DiagReport")
{
return true;
}
}
DisplayLicenseInfo()
方法:
protected void DisplayLicenseInfo(Stream inputStream)
{
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "LicensingStatus")
{
StatusLabel.Text += ("Licensing Status: " + reader.ReadString() + "<br><br>");
}
}
但是,我遇到一个XmlException
,表示“根级别的数据无效。第1行,第1位”。这是因为我已经读过一次输入流,需要重置它吗?如果是这样,我该怎么做?
答案 0 :(得分:7)
第一次在流周围创建XmlReader
时,它位于位置0.但是第二次创建XmlReader
时,流已经被部分读取,因此不再是在位置0,所以XmlReader
无法读取XML文档。
相反,您应该只创建一次XmlReader
:
using (XmlReader reader = XmlReader.Create(inputStream)
{
if (CorrectFileFormat(reader))
{
DisplayLicenseInfo(reader);
}
else
{
StatusLabel.Text = "Selected file is not a LicensingDiag XML file";
}
}
如果文件很小,您还可以考虑使用XmlDocument
或XDocument
(Linq to XML)加载整个XML文档
答案 1 :(得分:5)
@ thomas-levesque https://stackoverflow.com/users/98713/thomas-levesque是正确的,如果内容本身格式正确,那么您需要将流回滚到内容的开头。
CorrectFileFormat()方法:
protected Boolean CorrectFileFormat(Stream inputStream)
{
// rewind the stream back to the very beginning of the content
inputStream.Seek(0L, SeekOrigin.Begin);
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "DiagReport")
{
return true;
}
}
DisplayLicenseInfo()方法:
protected void DisplayLicenseInfo(Stream inputStream)
{
// rewind the stream back to the very beginning of the content
inputStream.Seek(0L, SeekOrigin.Begin);
XmlReader reader = XmlReader.Create(inputStream);
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "LicensingStatus")
{
StatusLabel.Text += ("Licensing Status: " + reader.ReadString() + "<br><br>");
}
}