web-dev-qa-db-ja.com

ストリームからのXMLの読み取り

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>");
    }

}
_

ただし、「ルートレベルのデータが無効です。行1、位置1」というXmlExceptionが表示されます。これは、入力ストリームを一度読んだことがあり、リセットする必要があるためですか?もしそうなら、どうすればいいですか?

7
Adam_G

ストリームの周囲に最初にXmlReaderを作成したときは、位置0にあります。ただし、2回目にXmlReaderを作成したとき、ストリームはすでに部分的に読み取られているため、位置0なので、XmlReaderはXMLドキュメントを読み取ることができません。

代わりに、XmlReaderを1回だけ作成する必要があります。

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ドキュメント全体をロードすることも検討できます。

7
Thomas Levesque

@ 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>");
    }
}
5
Lin Song Yang