Tshumore Ответов: 2

Как прочитать все теги XML-файла


У меня есть консольная программа, которая читает XML-файл и печатает некоторое выбранное значение в консоли. Когда я запускаю программу, я получаю исключение внутри исключения 1:
InvalidOperationException: <export_header xmlns="http://www.siriusfs.com/SFI/Export/GL_Export/20051005"> не ожидалось. для тега заголовка в файле. HResult=0x80131509
Сообщение=в XML - документе есть ошибка (2, 2).
Source=System.Xml


Мой сгенерированный класс выглядит следующим образом :

[XmlRoot(ElementName = "TRANSACTION")]
   public class TRANSACTION
    {

  public string Correspondence_country { get; set; }
        [XmlAttribute(AttributeName = "term")]
        public string Term { get; set; }
    [XmlAttribute(AttributeName = "mediatype_code")]
        public string mediatype_code { get; set; }
    }

     [XmlRoot(ElementName = "ContractData")]
    public class ContractData
    {
        [XmlElement(ElementName = "TRANSACTION")]
        public List<TRANSACTION> TRANSACTION { get; set; }
    }


Программы.в CS

static void Main(string[] args)
        {
            Console.WriteLine("\n" + "Reading BidAskCurves XML File");
            Console.WriteLine("===========================================================");
                     
            //get filename        
            string fileName = @"C:\Users\tshumae\Documents\MyProjects\SSPPureSunSystems\Files\GLExport58oct.xml";          
            string path = @"C:\Users\tshumae\Documents\MyProjects\SSPPureSunSystems\Files\";
            string result;
            result = Path.GetFileName(fileName);

            // Create an instance of the XmlSerializer.
            XmlSerializer serializer = new XmlSerializer(typeof(ContractData));

            // Declare an object variable of the type to be deserialized.
            ContractData item;

            using (XmlReader reader = XmlReader.Create(fileName))
            {
                // Call the Deserialize method to restore the object's state.
                item = (ContractData)serializer.Deserialize(reader);

                //Write out the properties of the object. (Visual Only, not needed)
                Console.Write(
                    item.TRANSACTION[0].Term + "\t" +
                    item.TRANSACTION[0].mediatype_code + "\t" );
                   
            }



И XML-схема, как показано ниже :
	<?xml version="1.0" encoding="utf-16"?>
<EXPORT_HEADER xmlns="http://www.siriusfs.com/SFI/Export/GL_Export/20051005" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.siriusfs.com/SFI/Export/GL_Export/20051005  GL_EXPORT.xsd" date_exported="2019-11-04T08:33:22.697" interface_name="GL_EXPORT" batch_id="212" batch_reference="GLX212" total_transactions="6109" total_amount="0.0000">
<TRANSACTION  mediatype_code="Zimbabwe" term="NB" />
  </TRANSACTION>
  </EXPORT_HEADER>


Любое понимание того, что я, возможно, делаю неправильно. В идеале программа должна вывести все значения.

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

Я попытался украсить свою корневую сущность атрибутом XmlRoot . Программа работает нормально , но только 1 значение первой строки, первый столбец выводится на консоль :
[XmlRoot(ElementName = "TRANSACTION")]
   public class TRANSACTION
    {

  public string Term { get; set; }
        [XmlAttribute(AttributeName = "term")]
        public string Term { get; set; }
    [XmlAttribute(AttributeName = "mediatype_code")]
        public string mediatype_code { get; set; }
    }

      [XmlRoot(Namespace = "http://www.siriusfs.com/SFI/Export/GL_Export/20051005", ElementName = "EXPORT_HEADER", DataType = "string", IsNullable = true)]
    // [XmlRoot(ElementName = "ContractData")]
//[XmlRoot(ElementName = "ContractData")]
    public class ContractData
    {
        [XmlElement(ElementName = "TRANSACTION")]
        public List<TRANSACTION> TRANSACTION { get; set; }
    }

2 Ответов

Рейтинг:
18

Richard Deeming

В вашем XML есть синтаксическая ошибка: <TRANSACTION> элемент самозакрывается, но у него также есть закрывающий тег.

Цитата:
Начальный тег 'EXPORT_HEADER' в строке 2 позиция 2 не совпадает с конечным тегом 'TRANSACTION'. Линия 4, позиция 5.
Как только это будет исправлено, ваш - То, что я пробовал" код работает для правильной десериализации XML. Тебе это не нужно. DataType и IsNullable атрибуты на экране ContractDataXmlRoot атрибут, и вам не нужен XmlRoot атрибут на экране TRANSACTION класс; но они не влияют на десериализацию.

Вы видите только одно значение, записанное в консоль, потому что в вашем XML есть только одно значение и потому что вы отображаете только первое значение. Если вы хотите отобразить все значения, вам нужно будет использовать цикл.
item = (ContractData)serializer.Deserialize(reader);

foreach (TRANSACTION transaction in item.TRANSACTION)
{
    Console.Write("{0}\t{1}\t", transaction.Term, transaction.mediatype_code);
}


Maciej Los

Ястребиный глаз!

Tshumore

Спасибо Ричарду, сожалею об опечатке при написании вопроса. Я внес изменения в программу в соответствии с вашими комментариями. Теперь я получаю исключение для 'item' в цикле foreach : "оператор foreach не может работать с переменными типа 'ContractData', поскольку 'ContractData' не содержит определения общедоступного экземпляра для 'GetEnumerator'

Richard Deeming

Извините, так и должно быть:

foreach (TRANSACTION transaction in item.TRANSACTION)

Рейтинг:
1

#realJSOP

Поместите блок try/catch вокруг вашего кода, чтобы вы могли видеть, где генерируется исключение. Кстати, это Invalid Operation исключение.