繁体   English   中英

XDocument.Load(Stream)如何检测XML消息的结尾?

[英]How does XDocument.Load(Stream) detect end of XML message?

我从TcpClient流中读取XDocument。 在实施时,我想知道XDocument.Load(Stream)如何知道文档何时完成?

我想到了几个主意,例如收到的流结束或没有更多可用的字节。 但是现在看来,接收到EndElement时Load()完成了。

有人知道Load(Stream)内部如何工作吗?

谢谢汤姆

很容易证明它读取了end元素之后-您只需要创建一个XML文件,该文件在end元素之后包含数据,从而使其无效:

<root>
  <child />
</root>

More stuff

如果您加载该代码,则会得到如下异常:

Unhandled Exception: System.Xml.XmlException: Data at the root level is invalid.
Line 5, position 1.

我强烈希望它能读到流的结尾。

摘自反汇编程序集:

[__DynamicallyInvokable]
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    public static XDocument Load(Stream stream)
    {
      return XDocument.Load(stream, LoadOptions.None);
    }

    [__DynamicallyInvokable]
    public static XDocument Load(Stream stream, LoadOptions options)
    {
      XmlReaderSettings xmlReaderSettings = XNode.GetXmlReaderSettings(options);
      using (XmlReader reader = XmlReader.Create(stream, xmlReaderSettings))
        return XDocument.Load(reader, options);
    }

在内部,它创建一个XML Reader并调用XDocument.Load方法(XmlReader) 。Stream会通过读取它的末尾(遵循周围的实现)来创建XML Reader。

更新 :我将XDocument误读为XmlDocument。 答案仍然有效。 您将读取到流的末尾,因为XDocument和XmlDocument都链接到XmlTextReaderImpl.InitStreamInput,这是发生流读取的位置。 一旦到达流的末尾,就开始处理数据。 如果解析失败,您将收到XmlException,但这会在所有流读取完成之后发生。

如果遍历.NET参考源,您将看到以下内容(用于从流中读取):

XDocument.Load(Stream)调用XmlReader.Create,该实例化XmlReaderSettings并在该实例上调用CreateReader,该实例化XmlTextReaderImpl,后者在该实例上调用FinishInitStream,该实例调用InitStreamInput。 这是大部分工作的地方,您可以在此找到基于读取的字符数的文件结尾检查。

注意:XmlDocument.Load(Stream)遵循类似的方法,该方法调用InitStreamInput(因此使用相同的流读取代码)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM