0

我正在尝试从看起来像这样的 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 在完成读取后关闭底层流。

4

1 回答 1

0

在这个问题中找到了答案。XmlReader 必须设置为仅读取片段,而不是文档。

using (var xmlReader = XmlReader.Create(_tcpReader, 
    new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Fragment}))
{
    xmlReader.MoveToContent();
    var xmlElement = (XElement) XNode.ReadFrom(xmlReader);  // works!
}

注意XElement.Loaddies: reader 在这个操作之后应该是 EOF。

于 2013-07-27T17:52:01.493 回答