XML.Save文件写作之谜

时间:2010-12-07 07:57:30

标签: c# xml

我在这里要做的是查看元素是否存在于xml文档中,如果它确实存在,那么我想修改它的内部文本。如果它不存在我想创建它并为它创建适当的内部文本。然而,当它确实存在一个元素时,我试图将它的内部文本更改为比整个xml文件写入更短的内容。

我的代码:

                XmlDocument xmldoc = new XmlDocument();
                xmldoc.Load(path);
                XmlNodeList felement = xmldoc.GetElementsByTagName(Element);
                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                if (felement.Count == 0)
                {
                    XmlElement elmRoot = xmldoc.DocumentElement;
                    XmlElement xmlele = xmldoc.CreateElement(Element);
                    xmlele.AppendChild(xmldoc.CreateTextNode(data));
                    elmRoot.AppendChild(xmlele);
                    xmldoc.Save(fs);
                }
                else
                {
                    felement[0].InnerText = data;
                    xmldoc.Save(fs);
                }
                fs.Close();

使用较短的内部文本修改之前的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<MyXMLFile>
  <Source>C:\Users\Dacto\Desktop\</Source>
  <Destination>C:\Program Files\Adobe</Destination>
</MyXMLFile>

更短的内部文字后:

    <?xml version="1.0" encoding="utf-8"?>
<MyXMLFile>
  <Source>C:\Users\Dacto\Desktop\Napster</Source>
  <Destination>C:\Users</Destination>
</MyXMLFile>/MyXMLFile>

参见“extra”/ MyXMLFile&gt;发生了什么事?

3 个答案:

答案 0 :(得分:2)

由于输出不是有效的XML,因此XmlDocument.Save不太可能生成文件的全部内容。鉴于此,我怀疑在创建FileStream时你应该提供一个不同的参数而不是FileMode.Open - FileMode.Create将确保文件在被写入之前被截断 - 当前它被覆盖,留下旧的内容到位如果新文件不够大,无法覆盖它。

答案 1 :(得分:0)

问题在于他们写出文件的方式,而不是xml。如果你尝试类似的东西,

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
byte[] info = new UTF8Encoding(true).GetBytes("AAAAA");
fs.Write(info, 0, info.Length);        

您应该看到:

AAAAA version="1.0" encoding="utf-8"?>
<MyXMLFile>
  <Source>C:\Users\Dacto\Desktop\</Source>
  <Destination>C:\Program Files\Adobe</Destination>
</MyXMLFile>

而不是FileMode.Open,您需要FileMode.Create,以便在您写入文件之前将其截断(如果文件已存在)。

答案 2 :(得分:0)

您必须保存XmlDocument的另一个选项是使用XmlWriter而不是FileStream。

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(path);
    XmlNodeList felement = xmldoc.GetElementsByTagName(Element);

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;

    using (XmlWriter wr = XmlWriter.Create(path), settings))
    {
        if (felement.Count == 0)
        {
            XmlElement elmRoot = xmldoc.DocumentElement;
            XmlElement xmlele = xmldoc.CreateElement(Element);
            xmlele.AppendChild(xmldoc.CreateTextNode(data));
            elmRoot.AppendChild(xmlele);
            xmldoc.Save(wr);
        }
        else
        {
            felement[0].InnerText = data;
            xmldoc.Save(wr);
        }
    }

另外,如果你继续使用原始的FileStream方法,那么我建议将它包装在一个using语句中,就像我上面用XmlWriter做的那样,如果你这样做,那么你可以去掉fs.Close()语句