[英]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.