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
が表示されます。これは、入力ストリームを一度読んだことがあり、リセットする必要があるためですか?もしそうなら、どうすればいいですか?
ストリームの周囲に最初に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ドキュメント全体をロードすることも検討できます。
@ 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>");
}
}