2011-01-30 15 views
9

StreamReaderを使用してWebサーバーから応答が返されました...この応答(XMLドキュメントファイル)を解析して値を取得しますが、これを実行しようとするたびにエラーが表示されます。ルート要素がありません。StreamReaderと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"); 
+1

を助けました。私はprefectlyフォーマットされたXMLファイルを取得し、私はコピーをファイルに貼り付け、手動で自分のコードでそれを読み取ろうとしました、それは動作します。 –

+2

また、これらのオブジェクトのほとんどで 'using'を使うべきです。あなたは 'WebClient'をWebリクエスト/レスポンスより簡単に見つけることができます - あるいは、答えの1つに書かれているように、' Load(path) 'でドキュメントを心配させてください。 –

+0

はい、私はそれを使用します...ありがとう再び! –

答えて

17

あなたはReadToEnd()を呼び出しており、すべてのデータを(文字列に)消費しました。これは、読者が何も与えることがないことを意味します。ただ:しないでください。または、それを行い、LoadXml(reaponseString)を使用してください。あなたは、あなたの質問に貼り付けた正確なコードでそれを行う場合

+0

ありがとう、Marc、それについて考えていないと本当に馬鹿だと感じたら... –

0

responseStringの内容何をチェック:おそらくそれは作るいくつかの追加のヘッダーが含まれていますxmlparserは不幸です。

2

は、その後、問題は、あなたが最初の文字列に全体の流れを読んで、あなたの場合は xmlDoc.Load(responseReader)

を呼び出すときに、もう一度ストリームを読み取ろうということです既にストリング全体を文字列に読み込み、その文字列を使用してxml文書を作成します。 xmlDoc.Load(responseString)

+0

2番目の使用法はLoadXmlでなければなりません。Load(文字列)はxmではなく* path *を期待しています –

5

Loadメソッドは、リモート・リソースからXML文書をフェッチできます。だから、このようなあなたのコードを簡素化することができます:

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

、...(ところで、あなたが適切に処分していなかった)任意のWebRequests、WebResponses、StreamReadersの不要に。これがうまくいかないのは、おそらくリモートXML文書が実際のXML文書ではなく、壊れているからです。

+0

OPは "Root element is欠落 "とは、応答にルート要素がないことを意味し、ルート要素に落とすか、応答を修正する必要があります。現在のコードは現在の方法に変更を加えません。 –

+0

@Saeed、いいえ、ストリームリーダーを正しく消費しないと、空の文字列が返され、XmlDocumentがエラーになります。 OPは最初にストリームリーダー上で 'ReadToEnd'を呼び出し、この同じリーダーを' Load'メソッドに渡しましたが、リーダーが既に終わりに位置していたので何も返しませんでした。私のコードでは、フレームワークに既に組み込まれているものに依存するため、私のコードで修正されています。もちろん、リモートXMLが壊れている場合は、最初に修正する必要があります。 –

+0

はい、最初に私はOPがそれらをさまざまなコードで試していると思う:)そして今、答えを受け入れた後、私は彼の間違いを見る。 –

-1

あなたが受け取るXMLには、コンテンツ全体をラップする最初の要素がないという意味です。たとえば、あなたはいくつかの要素で受け取る答えをラップしてみてください。

WebResponse response = webRequest.GetResponse(); 
Stream responseStream = response.GetResponseStream(); 
StreamReader responseReader = new StreamReader(responseStream); 
string responseString = responseReader.ReadToEnd(); 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXML("<root>" + responseString + "</root>"); 
XmlNodeList address = xmlDoc.GetElementsByTagName("original") 

希望これはConsole.Write(responseReader)で

関連する問題