需要帮助将XML文件反序列化为Object C#

问题描述

我在尝试将XML文件反序列化为C#中的对象时遇到问题。我在代码的最后一行收到以下错误

System.FormatException:'输入字符串的格式不正确。'

当我遇到异常并且将鼠标悬停在reader2上时,它说:

“空格,值=” \ n“

这是我的代码示例:

public static void LoadXML(string SIMDURL,string PREMURL)
{

    var MyDownloadedFile = new MemoryStream(new WebClient().DownloadData(SIMDURL));

    XmlSerializer reader = new XmlSerializer(typeof(Simulcast.EntryRaceCard));
    var reader2 = XmlReader.Create(MyDownloadedFile);
    Simulcast.EntryRaceCard overview;
    overview = (Simulcast.EntryRaceCard)reader.Deserialize(reader2);


}

解决方法

您需要XML的适当类模型。最简单的方法是下载将整个XML文档复制到剪贴板,然后使用Visual Studio的“将XML作为类粘贴”功能。只需创建一个空的命名空间来包含类,然后将类定义粘贴到其中即可。

或者,您可以使用XML Schema Definition Tool (Xsd.exe)从XML文档生成类。

enter image description here

然后您拥有的代码将起作用

    class Program
    {
        static WebClient wc = new WebClient();
        public static Simulcast.EntryRaceCard LoadXML(string url)
        {

            var MyDownloadedFile = new MemoryStream(wc.DownloadData(url));

            XmlSerializer reader = new XmlSerializer(typeof(Simulcast.EntryRaceCard));
            var reader2 = XmlReader.Create(MyDownloadedFile);
            var overview = (Simulcast.EntryRaceCard)reader.Deserialize(reader2);

            return overview;


        }
        static void Main(string[] args)
        {
            var url = "https://2m2pperformanceblob.blob.core.windows.net/simdpremcontainer/SIMD20201024KEE_USA.xml";
            var overview = LoadXML(url);
        }
    }
,

我使用以下代码对您的URL反序列化。我使用xsd.exe从位于XML顶部的架构中创建类

--http://ifd.equibase.com/schema/simulcast.xsd

我不得不将一个私有属性设为私有,这不能消除错误

   /// <remarks/>
    private EntryRaceGrade Grade {
        get {
            return this.gradeField;
        }
        set {
            this.gradeField = value;
        }
    }

这是代码

        const string URL = "https://2m2pperformanceblob.blob.core.windows.net/simdpremcontainer/SIMD20201024KEE_USA.xml";
        static void Main(string[] args)
        {
            XmlReader xReader = XmlReader.Create(URL);
            XmlSerializer serializer = new XmlSerializer(typeof(RaceCard));
            RaceCard raceCard = (RaceCard)serializer.Deserialize(xReader);
        }