将此 XML 反序列化为对象的最佳方法

Posted

技术标签:

【中文标题】将此 XML 反序列化为对象的最佳方法【英文标题】:Best way to deserialize this XML into an object 【发布时间】:2011-07-09 01:35:50 【问题描述】:

在我见过的与我的类似的其他示例中,有一个根节点,然后是一个数组节点,然后是一堆数组项。我的问题是,我的根节点 is 我的数组节点,所以我看到的示例似乎对我不起作用,我无法更改 XML 模式。这是 XML:

<articles>  
    <article>
      <guid>7f6da9df-1a91-4e20-8b66-07ac7548dc47</guid>
      <order>1</order>
      <type>deal_abstract</type>
      <textType></textType>
      <id></id>
      <title>Abu Dhabi's IPIC Eyes Bond Sale After Cepsa Buy</title>
      <summary>Abu Dhabi's IPIC has appointed banks for a potential sterling and euro-denominated bond issue, a document showed on Wednesday, after the firm acquired Spain's Cepsa in a $5 billion deal earlier this month...</summary>
      <readmore></readmore>
      <fileName></fileName>
      <articleDate>02/24/2011 00:00:00 AM</articleDate>
      <articleDateType></articleDateType>
    </article>

    <article>
      <guid>1c3e57a0-c471-425a-87dd-051e69ecb7c5</guid>
      <order>2</order>
      <type>deal_abstract</type>
      <textType></textType>
      <id></id>
      <title>Big Law Abuzz Over New China Security Review</title>
      <summary>China’s newly established foreign investment M&amp;A review committee has been the subject of much legal chatter in the Middle Kingdom and beyond. Earlier this month, the State Council unveiled legislative guidance on…</summary>
      <readmore></readmore>
      <fileName></fileName>
      <articleDate>02/23/2011 00:00:00 AM</articleDate>
      <articleDateType></articleDateType>
    </article>  
</articles>

这是我的课:

public class CurrentsResultsList

    public Article[] Articles;


public class Article

    public string Guid  get; set; 
    public int Order  get; set; 
    public string Type  get; set; 
    public string Title  get; set; 
    public string Summary  get; set; 
    public DateTime ArticleDate  get; set; 

这是来自外部 API 的 XML 响应。

【问题讨论】:

我相信你需要用这些坏男孩之一来标记你的班级:msdn.microsoft.com/en-us/library/… 仅供参考,如果您已经获得了模式的副本,则没有理由通过 XSD 实用程序运行您在上面发布的 XML,因为下面的每个人都建议。只需通过 XSD 实用程序运行您拥有的架构,即可生成允许您正确序列化/反序列化的类。 【参考方案1】:

您必须对一些 Xml 属性感到棘手,此代码应该有望生成您喜欢的 xml,希望对您有所帮助:

using System;
using System.IO;
using System.Xml.Serialization;

namespace xmlTest

    class Program
    
        static void Main(string[] args)
        
            var articles = new Articles();
            articles.ArticleArray = new ArticlesArticle[2]
            
                new ArticlesArticle()
                    
                        Guid = Guid.NewGuid(),
                        Order = 1,
                        Type = "deal_abstract",
                        Title = "Abu Dhabi...",
                        Summary = "Abu Dhabi...",
                        ArticleDate = new DateTime(2011,2,24)
                    ,
                new ArticlesArticle()
                    
                        Guid = Guid.NewGuid(),
                        Order = 2,
                        Type = "deal_abstract",
                        Title = "Abu Dhabi...",
                        Summary = "China...",
                        ArticleDate = new DateTime(2011,2,23)
                    ,
            ;

            var sw = new StringWriter();
            var xmlSer = new XmlSerializer(typeof (Articles));
            var noNamespaces = new XmlSerializerNamespaces();
            noNamespaces.Add("", ""); 
            xmlSer.Serialize(sw, articles,noNamespaces);
            Console.WriteLine(sw.ToString());
        
    

    [XmlRoot(ElementName = "articles", Namespace = "", IsNullable = false)]
    public class Articles
    
        [XmlElement("article")]
        public ArticlesArticle[] ArticleArray  get; set; 
    

    public class ArticlesArticle
    
        [XmlElement("guid")]
        public Guid Guid  get; set; 
        [XmlElement("order")]
        public int Order  get; set; 
        [XmlElement("type")]
        public string Type  get; set; 
        [XmlElement("textType")]
        public string TextType  get; set; 
        [XmlElement("id")]
        public int Id  get; set; 
        [XmlElement("title")]
        public string Title  get; set; 
        [XmlElement("summary")]
        public string Summary  get; set; 
        [XmlElement("readmore")]
        public string Readmore  get; set; 
        [XmlElement("fileName")]
        public string FileName  get; set; 
        [XmlElement("articleDate")]
        public DateTime ArticleDate  get; set; 
        [XmlElement("articleDateType")]
        public string ArticleDateType  get; set; 
    

【讨论】:

谢谢,这工作得相当好,而不必乱搞 xsd。【参考方案2】:
>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'test.xsd'.

>xsd /c test.xsd
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'test.cs'.

结果:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.0.30319.1.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class articles 

    private articlesArticle[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("article", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public articlesArticle[] Items 
        get 
            return this.itemsField;
        
        set 
            this.itemsField = value;
        
    


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class articlesArticle 

    private string guidField;

    private string orderField;

    private string typeField;

    private string textTypeField;

    private string idField;

    private string titleField;

    private string summaryField;

    private string readmoreField;

    private string fileNameField;

    private string articleDateField;

    private string articleDateTypeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string guid 
        get 
            return this.guidField;
        
        set 
            this.guidField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string order 
        get 
            return this.orderField;
        
        set 
            this.orderField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string type 
        get 
            return this.typeField;
        
        set 
            this.typeField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string textType 
        get 
            return this.textTypeField;
        
        set 
            this.textTypeField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string id 
        get 
            return this.idField;
        
        set 
            this.idField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string title 
        get 
            return this.titleField;
        
        set 
            this.titleField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string summary 
        get 
            return this.summaryField;
        
        set 
            this.summaryField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string readmore 
        get 
            return this.readmoreField;
        
        set 
            this.readmoreField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string fileName 
        get 
            return this.fileNameField;
        
        set 
            this.fileNameField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string articleDate 
        get 
            return this.articleDateField;
        
        set 
            this.articleDateField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string articleDateType 
        get 
            return this.articleDateTypeField;
        
        set 
            this.articleDateTypeField = value;
        
    

【讨论】:

【参考方案3】:
    把它放在visual studio里面的一个xml中 创建 xsd 架构 使用 "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe" "MyXsd.xsd" /t:lib /l:cs /c /namespace:my.xsd / outputdir:"C:\testtttt"

现在你已经准备好你的 c# 类了

现在你可以使用这个了:

internal class ParseXML 

    public static xsdClass ToClass<xsdClass>(XElement ResponseXML)
    
        return deserialize<xsdClass>(ResponseXML.ToString(SaveOptions.DisableFormatting));
     


    private static result deserialize<result>(string XML)
    
        using (TextReader textReader = new StringReader(XML))
        
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(result));
            return (result) xmlSerializer.Deserialize(textReader);
        
     
 

【讨论】:

嗨,我有 Visual Studio 10.0,我似乎无法在任何地方找到 xsd.exe,有​​什么提示吗?谢谢。 @Samo 在C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools进行快速搜索【参考方案4】:

我能想到的最简单的方法可能是使用xsd 工具。你给它 XML,它会从中生成一个模式。您可能需要稍微调整架构,但应该很接近。

从那里,您可以通过 xsd 将相同的架构发回以从中生成类。

【讨论】:

以上是关于将此 XML 反序列化为对象的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

csharp 此类演示了将对象序列化和反序列化为xml字符串的方法

如何将不同名称的 XML 节点反序列化为相同的基本类型

使用 Jackson XmlMapper 将 XML 反序列化为 POJO

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

将 XML 序列化为对象

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的