C# XDocument.Load(Stream)如何检测XML消息的结尾?
我正在从TcpClient流读取XDocument。在实现时,我想知道XDocument.Load(Stream)如何知道文档何时完成 我脑子里闪过几个想法,比如接收到的流结束或者没有更多的字节可用。但现在看来,当收到EndElement时,Load()就完成了 有人知道加载(流)内部是如何工作的吗 谢谢C# XDocument.Load(Stream)如何检测XML消息的结尾?,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我正在从TcpClient流读取XDocument。在实现时,我想知道XDocument.Load(Stream)如何知道文档何时完成 我脑子里闪过几个想法,比如接收到的流结束或者没有更多的字节可用。但现在看来,当收到EndElement时,Load()就完成了 有人知道加载(流)内部是如何工作的吗 谢谢 Tom很容易证明它读取的内容超过了结束元素-您只需创建一个XML文件,其中包含结束元素之后的数据,使其无效: <root> <child /> </root&
Tom很容易证明它读取的内容超过了结束元素-您只需创建一个XML文件,其中包含结束元素之后的数据,使其无效:
<root>
<child />
</root>
More stuff
我强烈希望它读取到流的末尾。很容易证明它读取的内容超过了end元素-您只需创建一个XML文件,其中包含end元素之后的数据,使其无效:
<root>
<child />
</root>
More stuff
我强烈希望它一直读到流的末尾。取自反编译程序集:
[__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读取器并调用XML读取器。XML读取器是通过流创建的,通过将其读到底(通过以下实现)取自反编译程序集:
[__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读取器并调用XML读取器。XML读取器是通过流创建的,通过将其读到底(通过遵循周围的实现)更新的:我将XDocument误读为XmlDocument。答案仍然有效。在流结束之前,您可以将XDocument和XmlDocument链接到XmlTextReaderImpl.InitStreamInput,这是进行流读取的地方。一旦到达流的末尾,就开始处理数据。如果解析失败,您将得到一个XmlException,但这发生在所有流读取完成之后 如果您浏览,您将看到以下内容(用于从流中读取): Load(Stream)调用XmlReader.Create,它实例化XmlReaderSettings并在该实例上调用CreateReader,它实例化XmlTextReaderImpl,它在该实例上调用FinishInitStream,它调用InitStreamInput。这是大部分工作发生的地方,您可以在这里找到基于读取字符数的文件结尾检查
注意:XmlDocument.Load(Stream)遵循一种调用InitStreamInput的类似方法(因此使用相同的流读取代码)更新了:我将XDocument误读为XmlDocument。答案仍然有效。在流结束之前,您可以将XDocument和XmlDocument链接到XmlTextReaderImpl.InitStreamInput,这是进行流读取的地方。一旦到达流的末尾,就开始处理数据。如果解析失败,您将得到一个XmlException,但这发生在所有流读取完成之后 如果您浏览,您将看到以下内容(用于从流中读取): Load(Stream)调用XmlReader.Create,它实例化XmlReaderSettings并在该实例上调用CreateReader,它实例化XmlTextReaderImpl,它在该实例上调用FinishInitStream,它调用InitStreamInput。这是大部分工作发生的地方,您可以在这里找到基于读取字符数的文件结尾检查
注意:XmlDocument.Load(Stream)遵循调用InitStreamInput的类似方法(因此使用相同的流读取代码)OP没有询问XmlDocument,而是询问XDocument。你的答案还有效吗?啊,我没听清楚。它仍然有效,因为在开始实际的内容解析之前,您仍然会调用XmlTextReader.InitStreamInput。更新文本以消除任何混淆,但不会更改实际答案。切题说明:此答案可能不适用于
XmlReader
,如XmlReader
,与XDocument
和XmlDocument
不同,OP不会一次读取整个Xml文件。OP没有询问XmlDocument,而是询问XDocument。你的答案还有效吗?啊,我没听清楚。它仍然有效,因为在开始实际的内容解析之前,您仍然会调用XmlTextReader.InitStreamInput。更新文本以消除任何混淆,但不会更改实际答案。切题说明:此答案可能不适用于XmlReader
,如XmlReader
,与XDocument
和XmlDocument
不同,它不会一次读取整个Xml文件。仅供参考:您可以直接查看源代码:@ChrisDunaway感谢Chris,我不知道它的存在。但是遵循引用和实现会有点困难:)仅供参考:您可以直接查看源代码,而不是反编译:@ChrisDunaway,谢谢Chris,我不知道它的存在。但是,要遵循参考资料和实现,要比你的答案难一点。所有3个都非常有用和正确,所以我把第一个标记为答案,并向上投票!谢谢你的回答。所有3个都非常有用和正确,所以我把第一个标记为答案,并向上投票!