Проблемы десериализации Xml в C # - PullRequest
0 голосов
/ 11 июля 2019

Я следую инструкциям, данным здесь для десериализации встроенного XML-документа.

Мой документ XML:

<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfAgency xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DbAgencyDefinition>
    <Name>RTD</Name>
    <Country>USA</Country>
    <City>Denver</City>
    <State>CO</State>
    <GtfsZipUrlDirectory>http://www.address.com/etc/</GtfsZipUrlDirectory>
    <GtfsZipUrlFileName>file_name.zip</GtfsZipUrlFileName>
  </DbAgencyDefinition>
</ArrayOfAgency>

Мой класс, к которому я обращаюсь:

public class DbAgencyDefinition
    {
        public string Name { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string GtfsZipUrlDirectory { get; set; }
        public string GtfsZipUrlFileName { get; set; }
        public string State { get; set; }
    }

Код, который пытается десериализовать XML в список DbAgencyDefinition:

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(DbAgencyDefinition)).Assembly;
            Stream stream = assembly.GetManifestResourceStream("MyNamespace.Resources.xml.AgencyDefinitions.xml");
            var agencies = new List<DbAgencyDefinition>();
            using (var reader = new StreamReader(stream))
            {
                var serializer = new XmlSerializer(typeof(List<DbAgencyDefinition>));
                agencies = (List<DbAgencyDefinition>)serializer.Deserialize(reader);
            }

Ошибка, которую я получаю:

System.Exception: There is an error in XML document. <ArrayOfAgency xmlns=''> was not expected

Я пробовал миллион вещей с XML, помечая класс как Serializable, и он всегда возвращает эту ошибку. Я посмотрел на примеры кода, которые дает учебник, и я не могу понять, почему я получаю эту ошибку.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

VS для Windows, а также, возможно, для Mac, имеет специальный инструмент, который преобразует скопированные Xml в автоматически сгенерированные классы.Теперь, это не идеально, но если вы возьмете свой XML-файл, он генерирует пару классов, подобных этому:

public class ArrayOfAgency
{
    public ArrayOfAgencyDbAgencyDefinition DbAgencyDefinition { get; set; }
}

public class ArrayOfAgencyDbAgencyDefinition
{
    public string Name { get; set; }
    public string Country { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string GtfsZipUrlDirectory { get; set; }
    public string GtfsZipUrlFileName { get; set; }
}

Как вы могли заметить, ArrayOfAgency определяется как класс, содержащий DbAgencyDefinition, которыйВот почему он выдает ошибку при попытке десериализации его непосредственно в List<DbAgencyDefinition>.Тип и то, что ожидает сериализатор, не совсем одинаковы.

var serializer = new XmlSerializer(typeof(ArrayOfAgency));
var agencies = ((ArrayOfAgency)serializer.Deserialize(reader)).DbAgencyDefinition;

Кроме того, как я упоминал, автоматическая генерация может быть не идеальной, поскольку ArrayOfAgency может потребоваться хранить массив вместо прямогокласс, если в Xml может быть несколько DbAgencyDefinition.

public class ArrayOfAgency
{
    public ArrayOfAgencyDbAgencyDefinition[] DbAgencyDefinition { get; set; }
}

Если вам нужна дополнительная помощь или информация о сериализации Xml, ознакомьтесь с документами .

0 голосов
/ 11 июля 2019

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication120
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            using (var reader = new StreamReader(FILENAME, Encoding.UTF8))
            {
                var serializer = new XmlSerializer(typeof(ArrayOfAgency));
                ArrayOfAgency agencies = (ArrayOfAgency)serializer.Deserialize(reader);
            }

        }
    }
    public class ArrayOfAgency
    {
        public DbAgencyDefinition DbAgencyDefinition { get; set; }
    }
    public class DbAgencyDefinition
    {
        public string Name { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string GtfsZipUrlDirectory { get; set; }
        public string GtfsZipUrlFileName { get; set; }
        public string State { get; set; }
    }

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