web-dev-qa-db-ja.com

StreamReaderとXMLファイルの読み取り

StreamReaderを使用してWebサーバーから応答を取得します...この応答(XMLドキュメントファイル)を解析して値を取得したいのですが、実行しようとするたびにエラーが発生します:ルート要素がありません。

同じXMLファイルを直接読み取ると、ファイルは適切にフォーマットされており、読み取ることができます。

これはストリームです:

WebResponse response = webRequest.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream);
string responseString = responseReader.ReadToEnd();

そして、これが私がXMLファイルを読み取ろうとする方法です。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(responseReader);
XmlNodeList address = xmlDoc.GetElementsByTagName("original");
10
Badr Hari

ReadToEnd()を呼び出したため、すべてのデータを(文字列に)消費しました。これは、読者が与えるものがこれ以上ないことを意味します。ただ:そうしないでください。または、それを実行してLoadXml(reaponseString)を使用します。

18
Marc Gravell

Load メソッドは、リモートリソースからXMLドキュメントをフェッチできます。したがって、次のようにコードを単純化できます。

var xmlDoc = new XmlDocument();
xmlDoc.Load("http://example.com/foo.xml");
var address = xmlDoc.GetElementsByTagName("original");

WebRequests、WebResponses、StreamReaders、...(ちなみに適切に破棄しなかった)は必要ありません。これが機能しない場合は、リモートXMLドキュメントが実際のXMLドキュメントではなく、壊れている可能性があります。

6
Darin Dimitrov

質問に貼り付けた正確なコードを使用してそれを行う場合、問題は、最初にストリーム全体を文字列に読み取り、次にxmlDoc.Load(responseReader)を呼び出すときにストリームを再度読み取ろうとすることです。

ストリーム全体を文字列に既に読み取っている場合は、その文字列を使用してxmlドキュメントを作成しますxmlDoc.Load(responseString)

2
Tomas

ResponseStringの内容を確認してください。おそらく、xmlparserを不幸にする追加のヘッダーがいくつか含まれています。

0
Felice Pollano