使用C#编辑Xml问题

时间:2011-04-14 11:04:02

标签: c# xml filestream edit

我之前发过一个关于通过c#

编辑我的xml文档的问题

C# write to XML error

但我现在又遇到了麻烦。我使用的确切代码然后再次出现问题!

当我第一次点击按钮时它似乎工作但是当我再次点击它时我得到错误

Data at the root level is invalid. Line 83, position 10

当你因为某种原因打开XML文档时,字符“”被添加到xml文档的开头,所以我得到了

"<?xml version="1.0" encoding="UTF-8"?>"

我不明白为什么,它真的让我疯了。我确信它之前有效。

我的代码:

path = test.xml

using (FileStream READER = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                System.Xml.XmlDocument Temp = new System.Xml.XmlDocument();
                Temp.Load(READER);

                using (FileStream WRITER = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
                {
                    Temp.Save(WRITER);
                }
}

1 个答案:

答案 0 :(得分:0)

更新#2

我按原样编制了你的样本,它对我来说非常合适。我使用直接从代码创建的文件以及在Visual Studio中创建的xaml文件对其进行了测试。因此,您正在使用的文件似乎已损坏或存在编码问题。

据我所知,您无法对损坏的文件做任何事情,但对于编码,您可以在使用StreamReader对象进行读取时指定它。您只需将所需的编码和读取器流传递给StreamReader的构造函数。它还可以选择从字节顺序标记中检测编码。

using (TextReader txtreader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.GetEncoding(1251 /*desired codepage here*/)))
        {
            document.Load(txtreader);
        }

using (TextReader txtreader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true /*tries to detect the encoding*/))
        {
            document.Load(txtreader);
        }

当然,您应该使用相同的编码保存文件,否则下次运行加载代码时会遇到问题。

此外,我附加了一个代码,如果该文件不存在,则会创建一个文件,如果已存在则只修改它。

class Program
{
    static readonly string path = @"C:\Users\Dmitry\Documents\test_3.xml";

    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
            test(path);
    }

    static void test(string path)
    {
        XmlDocument document = new XmlDocument();

        if (File.Exists(path))
        {
            using (Stream readStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                document.Load(readStream);
            }
        }
        else
        {                
            document.AppendChild(document.CreateXmlDeclaration("1.0", "UTF-8", String.Empty));
            document.AppendChild(document.CreateElement("Test"));
        }

        document.DocumentElement.AppendChild(document.CreateElement("Node"));

        using (FileStream WRITER = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
        {
            document.Save(WRITER);
        }
    }
}

我希望它可以帮到你。