AAB40 Ответов: 4

Необработанное исключение типа "system. argumentexception" произошло в mscorlib.dll дополнительная информация: незаконные символы в пути.


Привет,

Что я хочу сделать, так это изменить внутренний текст XML-файла. Поэтому я нажимаю на свою кнопку "Выбрать файл", которая загружается в текстовое поле. Я нажимаю на свою кнопку "изменить файл", чтобы изменить содержимое некоторых узлов. Затем я нажимаю на свою кнопку "СОХРАНИТЬ", чтобы сохранить изменения в нужном месте. Но когда я отлаживаю код, он выдает мне сообщение об ошибке (как в заголовке) в строке
"
doc.Load(selectedFile);
"
файл читается правильно, потому что при наведении курсора мыши на "selectedFile" я вижу содержимое, но "doc." выдает проблему.
1) Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы решить эту проблему, пожалуйста?
2) Может ли кто-нибудь сказать мне, даст ли результат код в цикле foreach в "btnMakeNegative_Click"?

Заранее спасибо.

Что я уже пробовал:

public partial class frmEditXML : Form
   {
       //get files from directory
       string[] path = Directory.GetFiles(@"C:\Users\decraiec\Documents\A_Automated", "*.XML");

       public frmEditXML()
       {
           InitializeComponent();
       }

       private void btnSelectFile_Click(object sender, EventArgs e)
       {
           openFileDialog1.Filter = "xml files|*.xml|All files|*.*";
           if (openFileDialog1.ShowDialog() == DialogResult.OK)
           {
               try
               {
                   richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
               }
               catch (Exception exc)
               {
                   MessageBox.Show("An error occured: " + System.Environment.NewLine + exc.ToString() + System.Environment.NewLine);
                   throw;
               }
           }
       }

       private void btnMakeNegative_Click(object sender, EventArgs e)
       {
           //Read selected file
           string selectedFile = richTextBox1.Text;
           XmlDocument doc = new XmlDocument();
           doc.Load(selectedFile); // --> error message
           //find the node to change the content
           //if node is not present, do nothing
           foreach (XmlNode xNode in doc)
           {
               if (xNode.ParentNode.Attributes["*.*"].Value != "")
               {
                   doc.SelectSingleNode("Identification").InnerText = "string";
                   doc.SelectSingleNode("SCI").InnerText = "string";
                   doc.SelectSingleNode("ReferenceType").InnerText = "string";
                   doc.SelectSingleNode("CCType").InnerText = "AA";
               }
               else { } //do nothing
           }

       }

       private void btnSavechanges_Click(object sender, EventArgs e)
       {
           if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
           {
               File.WriteAllText(saveFileDialog1.FileName, richTextBox1.Text);
           }
       }

       private void btnConvertToXML_Click(object sender, EventArgs e)
       {
           Form2 frm2 = new Form2();
           frm2.Show();

       }

       private void frmOpenRead_Load(object sender, EventArgs e)
       {
           Application.Exit();
       }


   }

njammy

Пожалуйста, пост XML-содержимое загружается.

4 Ответов

Рейтинг:
4

AAB40

закрываю этот выпуск и открываю еще один. Проблема заключается в чтении XML.

Как прочитать XML-текст из richttextbox, чтобы изменить внутренний текст?[^]


Рейтинг:
1

Jochen Arndt

string selectedFile = richTextBox1.Text;
XmlDocument doc = new XmlDocument();
doc.Load(selectedFile); // --> error message
Вы получаете имя файла из элемента управления RichText, который содержит недопустимое имя файла.

Я не знаю, какое имя файла вы хотите использовать, но похоже, что вам нужно сохранить выбранное имя файла где-то, чтобы использовать его вместо содержимого файла, загруженного в поле RichText.


AAB40

привет Йохен, мне нужно содержимое xml-файла, а не название xml-файла или заголовок. Речь идет о чтении содержимого выбранного мной файла и изменении в нем некоторого содержимого. Как вы выясните, что это имя файла из элемента управления RichtText, который я получаю, пожалуйста? Потому что я не вижу его нигде в сообщении об ошибке.???

Jochen Arndt

Видишь https://msdn.microsoft.com/en-us/library/875kz807(v=против 110). aspx:

XmlDocument.Метод Загрузки (Строка)
Загружает XML-документ с указанного URL-адреса.

Строку, переданную в метод load() должен быть действительный URL-адрес / имя файла.
Вы передаете содержимое файла, который был загружен в поле RichText:
richtextbox1 отображение.Командами(openFileDialog1.Имя файла, richTextBoxStreamType.открытый текст);

Если вы хотите прочитать содержимое файла как XmlDocument сохраните имя файла и используйте его:

// string selectedFile является членом
selectedFile = openFileDialog1.имя файла;

AAB40

ну ладно, спасибо. Теперь, все еще кувыркаясь над doc. LoadXml(selectedFile); но на этот раз он говорит, что первая строка моего XML неправильна, если я правильно ее понимаю: "данные на корневом уровне недопустимы. Строка 1, Позиция 1. " Мой xml-файл начинается с "<? xml version="1.0"?>". Я помню, что где-то читал это, но больше не могу найти. у вас есть идея, пожалуйста?

Jochen Arndt

В XML версии 1.0 эта строка заголовка рекомендуется, но необязательна.
В XML версии 1.1 требуется заголовок версии.

Для тестирования я предлагаю использовать мое решение чтения из файла. Это гарантирует, что содержимое не будет изменено при чтении содержимого в поле RichText.

Я не совсем уверен, как ведет себя RichText при чтении простых текстовых файлов. Но обычный элемент управления редактированием преобразует текст в Юникод (широкую строку), который, вероятно, не будет понят читателем XML, если он не вставит спецификацию. Если вы не знаете, о чем я говорю, просто попробуйте прямую загрузку из файла. Если это сработает, я был прав, и мы/вы должны найти решение этой проблемы. Решение зависит от того, что Вы, наконец, хотите сделать.

AAB40

Йохен, я уже это сделал. Вот где я получил сообщение об ошибке в первой строке:

// Чтение выбранного файла
строка selectedFile = openFileDialog1.имя файла;
XmlDocument doc = новый XmlDocument();
doc. LoadXml(selectedFile);
// найдите узел для изменения содержимого
//если узла нет, ничего не делайте
по каждому элементу (xNode руководство в DOC)
{
if (xNode.ParentNode.Атрибуты [ " *.*"]. Value != "")
{
док.SelectSingleNode ("Идентификация").InnerText = " строка";
док.SelectSingleNode ("ServiceComponentIdentification").InnerText = " строка";
док.SelectSingleNode ("ReferenceType").InnerText = " строка";
док.SelectSingleNode ("CostCategoryType").InnerText = " AA";
}
else { } / / ничего не делать
}

Jochen Arndt

Теперь вы используете LoadXml() с именем файла, которое, конечно же, не является допустимым XML.
Воспользуйся:
строка selectedFile = openFileDialog1.имя файла;
XmlDocument doc = новый XmlDocument();
док.Нагрузки(selectedFile); // загрузить() вот!

и убедитесь, что openFileDialog1.FileName содержит допустимое имя файла (или используйте жесткое кодовое имя для тестирования).

AAB40

ой... Я думаю, что мы неправильно понимаем друг друга, Йохен. цель состоит в том, чтобы автоматически сделать все положительные xml-файлы отрицательными. Таким образом, название должно оставаться прежним + "-NEG" в конце. Несколько внутренних текстов из узлов из файла, который я загрузил, должны измениться автоматически (с помощью кода). Поэтому я не могу использовать имя файла спуска, так как заголовок каждый раз отличается, каждый раз с каждым xml-файлом, который я выбираю.

Jochen Arndt

Я просто сосредотачиваюсь на реальной проблеме чтения XML-файла.

Просто забудьте на данный момент, что Вы, наконец, хотите сделать с несколькими файлами. Разбейте задачи на отдельные.

Первая задача-чтение контента без ошибок. Для этого вы можете создать образец XML-файла для тестирования (и использовать это имя "жестко закодировано" в вашем исходном коде, чтобы вам не приходилось выбирать файл вручную каждый раз, когда вы его тестируете).

После успешной загрузки файла следующая задача-обработка / изменение файла.

Затем сохраните файл с новым именем, добавив "- NEG".

Последняя задача-сделать это для нескольких / выбранных файлов. Теперь вы можете удалить фиксированное имя и использовать диалоговое окно файла или что-то еще, что требуется.

Все мои комментарии здесь-это предложения, чтобы узнать, что происходит. Они не предназначены для использования в конечном приложении.

AAB40

Йохен, я изменил свой код, чтобы изменить файл следующим образом:

// Чтение выбранного файла
строка selectedFile = @"C:\Users\decraiec\Documents\Visual Studio 2015\проекты\XML testversion.xml";
XmlDocument doc = новый XmlDocument();
doc. Load(selectedFile);
// найдите узел для изменения содержимого
//если узла нет, ничего не делайте
по каждому элементу (xNode руководство в DOC)
{
if (xNode.ParentNode.Атрибуты["*.*"].Значение != "") ==&ГТ; ошибка
{
док.SelectSingleNode ("Идентификация").InnerText = " строка";
док.SelectSingleNode ("SCI").InnerText = " строка";
док.SelectSingleNode ("ReferenceType").InnerText = " строка";
док.SelectSingleNode ("CCType").InnerText = " AA";
}
else { } / / ничего не делать
}

и теперь приложение говорит, что "объект не установлен в экземпляр ..." в строке
if (xNode.ParentNode.Атрибуты["*.*"].Значение != "").

Jochen Arndt

Как видите, решение проблем шаг за шагом имеет смысл.

Какая-то часть
xNode.ParentNode.Атрибуты [ " *.*"]. Value != ""
не существует.
Я немного не разбираюсь в XML-синтаксисе, поэтому не знаю немедленного ответа. Позже вы также используете определенные имена узлов, которые требуют знания вашей структуры XML-файла.

Но я предлагаю поставить для этого новый вопрос, потому что он больше не связан с первоначальными вопросами. Это имеет некоторые преимущества:
- Больше людей увидят новый вопрос и смогут помочь
- Длинные темы комментариев трудно читать
- Использование вопросов и решений обеспечивает лучшее удобство использования, чем комментарии

Рейтинг:
0

F-ES Sitecore

doc.Load(selectedFile); 


Load используется для загрузки XML из файла. Если у вас есть xml в переменной, которую вы хотите затем использовать (что у вас есть), то вместо этого используйте LoadXml

doc.LoadXml(selectedFile); 


AAB40

Привет F-ES, спасибо за ваше решение, которое работает, чтобы передать эту строку кода, но теперь c sharp говорит мне, что я должен использовать " new " для XmlNode. К вашему сведению: тем временем я немного изменил свой код.


doc. LoadXml(selectedFile);
// найдите узел для изменения содержимого
//если узла нет, ничего не делайте
по каждому элементу (xNode руководство в DOC)
{
if (xNode.ParentNode.Атрибуты [ " *.*"]. Value != "")
{
док.SelectSingleNode ("Идентификация").InnerText = " строка";
док.SelectSingleNode ("ServiceComponentIdentification").InnerText = " строка";
док.SelectSingleNode ("ReferenceType").InnerText = " строка";
док.SelectSingleNode ("CostCategoryType").InnerText = " AA";
}
else { } / / ничего не делать
}

Рейтинг:
0

CPallini

Когда вы нависаете над selectedFile и посмотрите на его содержание, это не значит, что содержание является допустимым путем для XmlDocument.load метод.
Используя отладчик для того, чтобы увидеть детали вызванного exeception, вы должны быть в состоянии определить проблему в таком пути (см. документация[^]).


AAB40

спасибо CPallini