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");
ReadToEnd()
を呼び出したため、すべてのデータを(文字列に)消費しました。これは、読者が与えるものがこれ以上ないことを意味します。ただ:そうしないでください。または、それを実行してLoadXml(reaponseString)
を使用します。
Load メソッドは、リモートリソースからXMLドキュメントをフェッチできます。したがって、次のようにコードを単純化できます。
var xmlDoc = new XmlDocument();
xmlDoc.Load("http://example.com/foo.xml");
var address = xmlDoc.GetElementsByTagName("original");
WebRequests、WebResponses、StreamReaders、...(ちなみに適切に破棄しなかった)は必要ありません。これが機能しない場合は、リモートXMLドキュメントが実際のXMLドキュメントではなく、壊れている可能性があります。
質問に貼り付けた正確なコードを使用してそれを行う場合、問題は、最初にストリーム全体を文字列に読み取り、次にxmlDoc.Load(responseReader)
を呼び出すときにストリームを再度読み取ろうとすることです。
ストリーム全体を文字列に既に読み取っている場合は、その文字列を使用してxmlドキュメントを作成しますxmlDoc.Load(responseString)
ResponseStringの内容を確認してください。おそらく、xmlparserを不幸にする追加のヘッダーがいくつか含まれています。