c# - 从流中读取 XML

标签 c# xml stream xmlreader

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

最佳答案

第一次围绕流创建一个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 文档

关于c# - 从流中读取 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17496175/

相关文章:

c# - C# 中的间隔容器

c# - Java 相当于 C# 的 StreamReader.ReadToEnd()

iphone:NSMutableURLRequest 为 MS Word 风格的撇号返回奇怪的字符

c# - 空的 ListViewGroup 不显示在 ListView 中

c# - 访问 ObservableCollection 中的项目绑定(bind)到 WPF DataGrid

java - 在文件上写入 DOM 时 XMLNS 属性被删除

html - 如何显示此HTML输出:使用XSLT ..的1 + 3 + 4 + 17 + 8 + 15 = 48?

json - 如何使用 JSONStream 对大对象进行字符串化

java - JAXB,如何在错误的情况下解码不同的对象

c# - 如何将流写入独立存储中的 xml 文件