Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XDocument.Load(Stream)如何检测XML消息的结尾?_C#_Xml_Linq To Xml - Fatal编程技术网

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

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&

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

我脑子里闪过几个想法,比如接收到的流结束或者没有更多的字节可用。但现在看来,当收到EndElement时,Load()就完成了

有人知道加载(流)内部是如何工作的吗

谢谢
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个都非常有用和正确,所以我把第一个标记为答案,并向上投票!