簡體   English   中英

在C#中反序列化Xml的問題

[英]Issues Deserializing Xml in C#

我正在遵循此處給出的反序列化嵌入式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,並且它總是返回此錯誤。 我查看了教程提供的代碼示例,但無法弄清楚為什么會出現此錯誤。

VS for 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可能需要保存數組,而不是直接類的,如果可以有多個DbAgencyDefinition以XML可能。

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

如果您需要有關Xml序列化的更多幫助或信息,請查閱docs

嘗試以下操作:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM