将此 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&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字符串的方法