9

我正在使用 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 位”。这是因为我已经读过一次输入流,需要重置它吗?如果是这样,我该怎么做?

4

2 回答 2

8

第一次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";
    }
}

如果文件很小,您还可以考虑使用XmlDocumentXDocument(Linq to XML)加载整个 XML 文档

于 2013-07-05T20:12:24.503 回答
6

@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>");
    }
}
于 2016-02-19T21:13:02.193 回答