使用c#编辑Xml的问题

本文关键字:问题 Xml 编辑 使用 | 更新日期: 2023-09-27 17:50:22

我之前发布了一个关于通过c#编辑xml文档的问题

c#写XML错误

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

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

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);
                }
}

使用c#编辑Xml的问题

UPDATE #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);
        }
    }
}