我正在尝试使用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
都抱怨根级别的无效内容;大概是3。在这两种情况下,都会观察到XmlReader当前位于"Xml"EndElement上。我希望XmlReader在找到结束元素后停止尝试使用基础流中的内容,以便后续从流中读取(即三次、四次)将成功。
当然,我也不希望XmlReader在完成读取后关闭底层流。
找到了这个问题的答案。XmlReader必须设置为仅读取片段,而不是文档。
using (var xmlReader = XmlReader.Create(_tcpReader,
new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Fragment}))
{
xmlReader.MoveToContent();
var xmlElement = (XElement) XNode.ReadFrom(xmlReader); // works!
}
请注意,XElement.Load
已死亡:此操作之后,读取器将被EOF。