【问题标题】:XmlReader is too greedyXmlReader 太贪心了
【发布时间】: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.LoadXNode.ReadFrom 都抱怨根级别的无效内容;大概是 3。在这两种情况下,都观察到 XmlReader 当前位于“Xml”EndElement 上。我希望 XmlReader 在找到结束元素后停止尝试使用底层流中的内容,以便后续从流中读取(即三、四)将成功。

当然,我也不希望 XmlReader 在完成读取后关闭底层流。

【问题讨论】:

  • 您可能必须自己阅读 XML 部分并将其存储在字符串中。 XmlReader 并不贪心;如果您打开一个 XML 文件并一直读取它直到第一个元素被关闭,您可能会错过确实存在多个根元素并且该文件是无效的。
  • 但仅此而已:我不希望 XmlReader 从底层流中读取 file,我希望它读取单个 element(及其所有复杂的内容)。稍后我会从同一个流中读取更多的行和元素。
  • 我的意思是 XmlReader 不是用来读取单个元素的,并且必须进行这种前向读取才能符合要求。如果您需要它来读取流的子集,则必须自己隔离所述子集。

标签: c# xml stream


【解决方案1】:

this question 中找到答案。 XmlReader 必须设置为仅读取片段,而不是文档。

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

请注意XElement.Load 死了:此操作后阅读器应为 EOF。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多