C# XmlDocument.Load(字符串文件名)和XmlDocument.Load(FileStream fs)之间的差异

C# XmlDocument.Load(字符串文件名)和XmlDocument.Load(FileStream fs)之间的差异,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我尝试了一些将新的子对象添加到XML文件的代码。我注意到使用XmlDocument.Load(字符串文件名)和XmlDocument.Load(FileStream fs)的结果是不同的。下面显示了原始XML文件数据 <?xml version="1.0" encoding="utf-8"?> <grandparent> <parent> <child> <grandchild>some

我尝试了一些将新的子对象添加到XML文件的代码。我注意到使用XmlDocument.Load(字符串文件名)和XmlDocument.Load(FileStream fs)的结果是不同的。下面显示了原始XML文件数据

<?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
    </parent>
</grandparent>
结果XML文件工作正常,如下所示

<?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
        <child>
            <grandchild>different text here</grandchild>
        </child>
    </parent>
</grandparent>
<?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
    </parent>
</grandparent><?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
        <child>
            <grandchild>different text here</grandchild>
        </child>
    </parent>
</grandparent>
结果XML文件将非常奇怪,就像再次复制整个XML文件一样,如下所示

<?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
        <child>
            <grandchild>different text here</grandchild>
        </child>
    </parent>
</grandparent>
<?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
    </parent>
</grandparent><?xml version="1.0" encoding="utf-8"?>
<grandparent>
    <parent>
        <child>
            <grandchild>some text here</grandchild>
        </child>
        <child>
            <grandchild>another text here</grandchild>
        </child>
        <child>
            <grandchild>different text here</grandchild>
        </child>
    </parent>
</grandparent>

这里有一些文字
这里是另一个文本
这里有一些文字
这里是另一个文本
这里有不同的文字
有人能告诉我为什么吗?提前感谢。

调用XmlDocument.Save(FileStream fs)会将XmlDocument数据附加到流中

前面对同一个FileStream实例的XmlDocument.Load(FileStream fs)调用将导致FileStream的位置偏移原始xml文件中的字节数。因此,在此FileStream实例上执行的任何附加操作都将在读入数据之后执行。为了对抗这种情况,您需要重置FileStream的位置

要重置FileStream实例的位置,请使用:

... FileStream fs ...
... XmlDocument doc ...

fs.SetLength(0); //Optional: Clears the file on disk
fs.Flush(); //Optional: Flushes the stream to write the clear to disk
fs.Position = 0; //Resets the position of the stream
doc.Save(fs); //Save the XmlDocument to the FileStream
编辑:两个文件流方法。注意,我已将FileMode更改为FileMode.Create,然后再调用XmlDocument.Save;这将创建一个全新的文件(清除文件的内容)

调用XmlDocument.Save(FileStream fs)将把XmlDocument数据附加到流中

前面对同一个FileStream实例的XmlDocument.Load(FileStream fs)调用将导致FileStream的位置偏移原始xml文件中的字节数。因此,在此FileStream实例上执行的任何附加操作都将在读入数据之后执行。为了对抗这种情况,您需要重置FileStream的位置

要重置FileStream实例的位置,请使用:

... FileStream fs ...
... XmlDocument doc ...

fs.SetLength(0); //Optional: Clears the file on disk
fs.Flush(); //Optional: Flushes the stream to write the clear to disk
fs.Position = 0; //Resets the position of the stream
doc.Save(fs); //Save the XmlDocument to the FileStream
编辑:两个文件流方法。注意,我已经将文件模式更改为FileMode。在调用XmlDocument.Save之前创建;这将创建一个全新的文件(清除文件的内容)


如果您从流中加载它,然后将其保存到文件中,该怎么办?我现在不太了解流,但我认为写入流会将数据附加到缓冲区。可能在保存之前先刷新流?@NicolásStraubValdivieso如果我从流中加载它并将其保存到文件中,效果会很好。如果从流中加载它然后将其保存到文件中呢?我现在不太了解流,但我认为写入流会将数据附加到缓冲区。可能在保存之前先刷新流?@NicolásStraubValdivieso如果我从流中加载它,并将其保存到文件中,效果会很好。+1。。。关闭和重新打开流可能更具可读性,但更改位置也可以。@AlexeiLevenkov我完全同意,并使用语句将它们包装起来。我建议使用两个文件流。一个用于读取XMLDocument,另一个用于将其写入磁盘。非常感谢。您帮助我更多地了解FileStream的实际工作原理+1.关闭和重新打开流可能更具可读性,但更改位置也可以。@AlexeiLevenkov我完全同意,并使用语句将它们包装起来。我建议使用两个文件流。一个用于读取XMLDocument,另一个用于将其写入磁盘。非常感谢。您帮助我更多地了解FileStream的实际工作原理!