【发布时间】:2013-07-27 16:01:42
【问题描述】:
我正在尝试使用 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 在完成读取后关闭底层流。
【问题讨论】:
-
您可能必须自己阅读 XML 部分并将其存储在字符串中。 XmlReader 并不贪心;如果您打开一个 XML 文件并一直读取它直到第一个元素被关闭,您可能会错过确实存在多个根元素并且该文件是无效的。
-
但仅此而已:我不希望 XmlReader 从底层流中读取 file,我希望它读取单个 element(及其所有复杂的内容)。稍后我会从同一个流中读取更多的行和元素。
-
我的意思是 XmlReader 不是用来读取单个元素的,并且必须进行这种前向读取才能符合要求。如果您需要它来读取流的子集,则必须自己隔离所述子集。