次のような tcp ストリームからコンテンツを消費しようとしています。
1
2
<Xml att='value'>
<Child> ... </Child>
</Xml>
3
4
次のようなコードを使用します。
var one = Convert.ToInt32(_tcpReader.ReadLine()); // ok
var two = Convert.ToInt32(_tcpReader.ReadLine()); // ok
using (var xmlReader = XmlReader.Create(_tcpReader))
{
xmlReader.MoveToContent();
var xmlElement = XElement.Load(xmlReader); // dies
//(XElement) XNode.ReadFrom(xmlReader); // also dies
}
var three = Convert.ToInt32(_tcpReader.ReadLine());
var four = Convert.ToInt32(_tcpReader.ReadLine());
問題は、 と の両方XElement.Load
がXNode.ReadFrom
ルート レベルで無効なコンテンツについて文句を言うことです。どちらの場合も、XmlReader は現在 "Xml" EndElement にあることがわかります。ストリームからの後続の読み取り (つまり、3、4) が成功するように、XmlReader が終了要素を見つけた後、基になるストリームからコンテンツを消費しようとするのを停止する必要があります。
また、もちろん、XmlReader が読み取りを終了した後で基になるストリームを閉じることは望ましくありません。