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

Posted

技术标签:

【中文标题】需要帮助将 XML 文件反序列化为对象 C#【英文标题】:Need help Deserializing XML file to Object C# 【发布时间】:2021-02-13 22:55:31 【问题描述】:

我在尝试将 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 的 URL:2m2pperformanceblob.blob.core.windows.net/simdpremcontainer/… 这是您期望的,但可能不是new WebClient().DownloadData 实际上返回的结果。 @HimBromBeere 你能帮我写一个子程序来反序列化这个 xml 文档吗?我认为这里的另一个问题是两个命名空间。 【参考方案1】:

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

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

那么你的代码就可以工作了

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

【讨论】:

【参考方案2】:

我使用以下代码反序列化您的 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);
        

【讨论】:

以上是关于需要帮助将 XML 文件反序列化为对象 C#的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 文件反序列化为 C# 类对象时出错

将 ODATA xml 序列化/反序列化为 C# 对象

C# XML对象序列化反序列化 - PEPE YU

将 xml 反序列化为 c# 对象时,XML 文档 (2, 2) 出现错误

将 Web 服务 API 中的 XML 字符串反序列化为 C# 对象

C# 在忽略命名空间的同时反序列化 xml