Проблема редактирования XML с использованием C # - PullRequest
0 голосов
/ 14 апреля 2011

Предыдущий вопрос был опубликован относительно редактирования моего XML-документа с помощью c #

.

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

1 Ответ

0 голосов
/ 14 апреля 2011

ОБНОВЛЕНИЕ № 2 :

Я скомпилировал ваш образец как есть, и он отлично сработал Я протестировал его с помощью файла, созданного прямо из кода, а также с файлом xaml, созданным в Visual Studio. Похоже, файл, с которым вы работаете, поврежден или имеет проблему с кодировкой.

Насколько я знаю, вы ничего не можете сделать с поврежденным файлом, но что касается кодировки, вы можете указать это при чтении с помощью объекта 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);
        }
    }
}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...