AAB40 Ответов: 3

Xml: "недопустимые символы в пути" на корневом элементе


Почему все, что я пытаюсь прочитать из XML-файла, падает на корневой элемент?

<? xml version= "1.0"?>
&ЛТ;AnXMLTestFile префиксом xmlns:xsi в="http://www.w3.org/2001/XMLSchema-instance" префиксом xmlns:xsd-файл="http://www.w3.org/2001/XMLSchema" атрибутов xmlns="ООН:ЕЭК ООН:260:сведения:еем:02-02-AnXMLTestFile"&ГТ;

/* С помощью класса XmlReader, объект XmlDocument, спецификации, MemoryStreamer/писателя ...
Даже если я опущу метод ' Encoding GetEncoding ()', у меня все равно будет 'запрещенные символы в пути на главную
XmlTextReader reader = new XmlTextReader(doc.ToString());

*/
Улучшение:
очистил какой-то код только для того, чтобы использовать основы. изменил строку для использования
string xml = richTextBox1.Text;


Теперь код не зацикливается на моем списке узлов.

Кто-нибудь может мне помочь, пожалуйста? Заранее спасибо.

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

Пример XML-файла
<?xml version="1.0"?>
<AnXMLTestFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="un:unece:260:data:EEM:02-02-AnXMLTestFile">
  <HeaderBEDocument>
    <Identification>45071dc8-558d-439a-8f0a-88ae73a74910</Identification>
    <DocumentType listAgencyIdentifier="6">386</DocumentType>
    <Creation>2016-06-14T12:31:58.0+01:00</Creation>
    <SenderBEEnergyParty>
      <Identification schemeAgencyIdentifier="9">5414488009809</Identification>
    </SenderBEEnergyParty>
    <RecipientBEEnergyParty>
      <Identification schemeAgencyIdentifier="9">0000000000000</Identification>  
    </RecipientBEEnergyParty>
    <IssuerBEEnergyParty>
      <Identification schemeAgencyIdentifier="9">5414488009809</Identification>
    </IssuerBEEnergyParty>
    <AddresseeBEEnergyParty>
      <Identification schemeAgencyIdentifier="9">0000000000000</Identification>
    </AddresseeBEEnergyParty>
    <DocumentStructureRevision>02-02.001</DocumentStructureRevision>
  </HeaderBEDocument>

        private void btnSelectFile_Click(object sender, EventArgs e)
        {
            // Create an OpenFileDialog object.
            OpenFileDialog openFile1 = new OpenFileDialog();

            // Initialize the filter to look for text files.
            openFile1.Filter = "Xml Files|*.xml";

            // If the user selected a file, load its contents into the RichTextBox. 
            if (openFile1.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);
            }
        }
 private void btnMakeNegative_Click(object sender, EventArgs e)
        {
            // Load XML
            var doc = new XmlDocument();
            string xml = richTextBox1.Text;
            doc.LoadXml(xml);

            // Define Default namespace and add prefix to use in Xpath (Mandatory!)
            var nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("x", "un:unece:260:data:EEM:AnXMLTestFile");

            // Selecting All HeaderBEDocument nodes
            var nodeList = doc.DocumentElement.SelectNodes("//x:HeaderBEDocument", nsmgr);

            // Loop all HeaderBEDocument nodes
            foreach (XmlNode node in nodeList)
            {
                // Select Identification node under HeaderBEDocument node
                var identificationNode = node.SelectSingleNode("x:Identification", nsmgr);
                if (identificationNode != null)
                {
                    // Change value of indentification node to string
                    identificationNode.InnerText = "string";
                }
                // Select SCI node under HeaderBEDocument node
                var SCI = node.SelectSingleNode("x:SCI", nsmgr);
                if (SCI != null)
                {
                    // change value of SCI node to string
                    SCI.InnerText = "56987465";
                }
                // Select ReferenceType node under HeaderBEDocument node
                var ReferenceType = node.SelectSingleNode("x:ReferenceType", nsmgr);
                if (ReferenceType != null)
                {
                    // change value of ReferenceType node to string
                    ReferenceType.InnerText = "AA";
                }
                // Select CCType node under HeaderBEDocument node
                var CCType = node.SelectSingleNode("x:CCType", nsmgr);
                if (CCType != null)
                {
                    // change value of CCType node to string
                    CCType.InnerText = "string";
                }
            }

            // Print new XML in richtextbox
           richTextBox1.Text = nodeList.ToString();
        }

}

Richard Deeming

15 дней и пять вопросов спустя, и я начинаю думать, что здесь есть эхо!

Строка, содержащая XML-это НЕ допустимый путь к файлу. Это две совершенно разные вещи. Вы не можете передать одно методу, который ожидает другого.

Это похоже на разницу между дизельным топливом и неэтилированным - они обе жидкости, но если вы положите не ту в свою машину, это не закончится хорошо!

Если вы действительно не понимаете, о чем мы говорим, пожалуйста дайте нам знать. Не просто повторяйте один и тот же вопрос снова и снова.

3 Ответов

Рейтинг:
2

Jochen Arndt

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

То Конструктор XmlTextReader (Строка) (System.Xml)[^] ожидает строку, содержащую допустимое имя файла, но вы передаете doc.ToString() это, вероятно, не имя файла, а какое-то содержимое файла.


AAB40

привет Йохен, да, это действительно содержимое richtextbox, которое нужно прочитать, и это должен быть xml-файл. Я не могу добавить строковое имя файла, так как оно уже находится в richtextbox. :- (Так что на самом деле я поворачиваюсь кругом, не находя никакого решения тому, что я хочу сделать.?

Jochen Arndt

XmlTextReader - это, как следует из названия, класс для чтения из файлов или потоков.

Если у вас есть поле richtext, содержащее XML-содержимое, определите, что вы хотите с ним сделать, и выберите соответствующий класс, например XmlDocument, как это было в вашем предыдущем вопросе.

AAB40

Улучшен код.

Jochen Arndt

Пожалуйста, не редактируйте свои вопросы таким образом.

На первоначальный вопрос "незаконные персонажи в пути" ответили Я и Грифф. То есть на него отвечают и его следует считать закрытым.

Изменение вопросов путем добавления несвязанного контента и удаления связанного контента нарушит весь контекст.

Просто закрой это и начни новое. Но я предлагаю сначала подумать о том, что вы хотите сделать. То есть: определите требования.

AAB40

Йохен, я думаю, что пришло время, чтобы все люди в CodeProject поговорили друг с другом, чтобы найти хорошее решение о том, что делать и чего не делать. В предыдущем потоке Karthik попросил меня обновить проблему, если я что-то изменил. Не для того, чтобы каждый раз открывать новую тему, которая выглядит как репост, а они все будут выглядеть как репост. Потому что я уже 5 лет пользуюсь Си-диезом и никогда не был программистом, поэтому все, что я спрошу, будет смотреть друг на друга. Но стараюсь.... Спасибо, что уделили мне время!

Jochen Arndt

Есть четкое правило:

Отредактируйте и обновите свой вопрос с дополнительной информацией о проблеме (например, при получении комментариев с просьбой разъяснить) или если вы сами нашли что-то связанное и важное.

Откройте новый вопрос, когда речь идет о новой / другой проблеме.

Если кто-то говорит вам, что вы должны редактировать, а не репостить, потому что вы показываете один и тот же код, скажите им, что речь идет о другой / новой проблеме.

Но "как изменить внутренний текст в childelements и показать его в richtextbox?" и " как изменить внутренний текст из жестко закодированного XML-файла?" смотрите похожие.

Вы также можете задать несколько вопросов одновременно. Например, "у меня есть этот код и эти проблемы". Но имейте в виду, что некоторые не ответят, если будет слишком много вопросов, и что это может привести к большим потокам комментариев.

Также не публикуйте решения, которые не являются решениями. Они, вероятно, будут сообщены как таковые и удалены.

Рейтинг:
2

OriginalGriff

Это не должно быть XML - это имя файла и путь к файлу, а не содержимое XML-файла.
Это не XML жалуется, это файловая система говорит вам, что некоторые символы в вашем пути к файлу не разрешены - и это означает, что вместо передачи имени файла вашему методу вы передаете строку XML.

Используйте отладчик, проверьте значение передаваемого параметра, а затем попытайтесь выяснить, почему вы передали функцию не ту вещь.


Рейтинг:
10

AAB40

1) чтобы передать цикл NodeList, посмотрите через него, что пространство имен, которое вы добавляете, является полным и таким же, как и в файле. Не отрезай.
2) Убедитесь, что вы не используете один из существующих IEnumerables для XML.
- " "
- "описание"
- "XML"
добавьте указанный, как я это сделал, с именем "x". Он будет добавлен в список IEnumerable.

Код работает не полностью, но на этот раз мы прошли nodeList благодаря Йохену.

// Load XML
           var doc = new XmlDocument();
           string xml = richTextBox1.Text;
           doc.LoadXml(xml);

           XmlTextReader reader = new XmlTextReader(new StringReader(xml));
           System.Data.DataSet ds = new System.Data.DataSet();
           ds.ReadXml(reader, System.Data.XmlReadMode.Auto);

           // Define Default namespace and add prefix to use in Xpath (Mandatory!)
           var nsmgr = new XmlNamespaceManager(doc.NameTable);
           nsmgr.AddNamespace("x", "un:unece:260:data:EEM:02-02-AnXMLTestFile");

           // Selecting All HeaderBEDocument nodes
           var nodeList = doc.DocumentElement.SelectNodes("//x:HeaderBEDocument", nsmgr);

           // Loop all HeaderBEDocument nodes
           foreach (XmlNode node in nodeList)
           {
               // Select Identification node under HeaderBEDocument node
               var identificationNode = node.SelectSingleNode("x:Identification", nsmgr);
               if (identificationNode != null)
               {
                   // Change value of indentification node to string
                   identificationNode.InnerText = "string";
               }
               // Select SCI node under HeaderBEDocument node
               var SCI = node.SelectSingleNode("x:SCI", nsmgr);
               if (SCI != null)
               {
                   // change value of SCI node to string
                   SCI.InnerText = "56987465";
               }
               // Select ReferenceType node under HeaderBEDocument node
               var ReferenceType = node.SelectSingleNode("x:ReferenceType", nsmgr);
               if (ReferenceType != null)
               {
                   // change value of ReferenceType node to string
                   ReferenceType.InnerText = "AA";
               }
               // Select CCType node under HeaderBEDocument node
               var CCType = node.SelectSingleNode("x:CCType", nsmgr);
               if (CCType != null)
               {
                   // change value of CCType node to string
                   CCType.InnerText = "string";
               }
           }

           // Print new XML in richtextbox
          richTextBox1.Text = nodeList.ToString();
       }