我需要创建以下XML并希望通过XmlSerialization创建它,以便可以通过对象动态生成数据本身。
<chart>
<series>
<value xid="0">Not Submitted: 20</value>
<value xid="1">Submitted: 11</value>
<value xid="2">Rejected: 2</value>
</series>
<graphs>
<graph gid="0">
<value xid="0" color="#FF0000">20</value>
<value xid="1" color="#00FF00">11</value>
<value xid="2" color="#0000FF">2</value>
</graph>
<graph gid="1">
<value xid="0" color="#FF0000">24</value>
<value xid="1" color="#00FF00">7</value>
<value xid="2" color="#0000FF">4</value>
</graph>
</graphs>
</chart>
我最初想出了这个,但它没有完全奏效(事实上,其中一些是完全错误的)。有什么想法吗?
// the //chart/series/value elements with attributes
internal class BarChartSeriesValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/graphs/graph/value elements with attributes
internal class BarChartGraphValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlAttribute(AttributeName = "color")]
public string Color { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/series collection of values
internal class BarChartSeries : List<BarChartSeriesValue>
{
[XmlElement(ElementName = "series")]
public List<BarChartSeriesValue> Series { get; set; }
}
// the //chart/graphs/graph collection of values
internal class BarChartGraph : List<BarChartGraphValue>
{
[XmlAttribute(AttributeName = "gid")]
public int GraphId { get; set; }
}
// the //chart/graphs collection of graph elements
internal class BarChartData
{
[XmlElement(ElementName = "series")]
public BarChartSeries Series { get; set; }
[XmlElement(ElementName = "graphs")]
public BarChartGraph Graphs { get; set; }
}
编辑 - 太平洋标准时间8月22日晚11点24分
当我说它只是完全错误时,我所要做的就是查看它并意识到数据结构不会映射到所需的XML。真正抛弃我的部分是嵌套的图形结构
我以前不知道通过XSD从XML生成类。它看起来非常有用和有用
感谢所有提供解决方案的人
答案 0 :(得分:3)
这是一个快速项目。
我使用这个类或它的变体: Generic XML Serializer Class for C# and an XML Serialization usage example
然后这是您需要的代码。
[XmlRoot("chart")]
public class Chart
{
[XmlElement("series")]
public Series Series { get; set; }
[XmlArray("graphs")]
[XmlArrayItem("graph")]
public Graphs Graphs { get; set; }
}
public class Series
{
[XmlElement("value")]
public List<SeriesValue> Values { get; set; }
}
public class Graphs : List<Graph>
{
}
public class Graph
{
[XmlAttribute("gid")]
public int Gid { get; set; }
[XmlElement("value")]
public List<GraphValue> Values { get; set; }
}
public class GraphValue
{
[XmlAttribute("xid")]
public int Xid { get; set; }
[XmlAttribute("color")]
public String Color { get; set; }
[XmlText]
public int Value { get; set; }
}
public class SeriesValue
{
[XmlAttribute("xid")]
public int Xid { get; set; }
[XmlText]
public String Text { get; set; }
}
以下是如何使用它。
class Program
{
static void Main(string[] args)
{
Chart c = new Chart();
c.Series = new Series();
c.Series.Values = new List<SeriesValue>();
c.Series.Values.Add(new SeriesValue() { Xid = 0, Text = "Not Submitted: 20" });
c.Series.Values.Add(new SeriesValue() { Xid = 1, Text = "Submitted: 11" });
c.Series.Values.Add(new SeriesValue() { Xid = 2, Text = "Rejected: 2" });
c.Graphs = new Graphs();
c.Graphs.Add(new Graph() { Gid = 0 });
c.Graphs[0].Values = new List<GraphValue>();
c.Graphs[0].Values.Add(new GraphValue() { Xid = 0, Color = "#FF0000", Value = 20 });
c.Graphs[0].Values.Add(new GraphValue() { Xid = 1, Color = "#00FF00", Value = 11 });
c.Graphs[0].Values.Add(new GraphValue() { Xid = 2, Color = "#0000FF", Value = 2 });
c.Graphs.Add(new Graph() { Gid = 1 });
c.Graphs[1].Values = new List<GraphValue>();
c.Graphs[1].Values.Add(new GraphValue() { Xid = 0, Color = "#FF0000", Value = 24 });
c.Graphs[1].Values.Add(new GraphValue() { Xid = 1, Color = "#00FF00", Value = 7 });
c.Graphs[1].Values.Add(new GraphValue() { Xid = 2, Color = "#0000FF", Value = 4 });
// Make sure it is Serializable
Serializer.SerializeToXML<Chart>(c, "chart.xml");
// Make sure it is Deserializable
Chart c2 = Serializer.DeserializeFromXML<Chart>("chart.xml");
}
}
答案 1 :(得分:2)
您可以使用XSD.exe生成该类,我认为它是视觉工作室的一部分。
如果打开Visual Studio命令提示符,则可以访问它。
在某处的硬盘上创建一个物理XML文件。 (我使用了你的xml和crated sample.xml)
打开Visual Studio命令提示符
导航到目录
输入'xsd sample.xml'(不带引号)这将生成sample.xsd
输入'xsd sample.xsd / c'(不带引号)这将生成sample.cs
设置使用Microsoft Visual Studio 2008 x86工具的环境。
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>G:
G:\>xsd sample.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'G:\sample.xsd'.
G:\>xsd sample.xsd /c
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'G:\sample.cs'.
G:\>
生成:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="chart" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="value" nillable="true">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="value_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute name="xid" type="xs:string" />
<xs:attribute name="color" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="chart" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="value" />
<xs:element name="series">
<xs:complexType>
<xs:sequence>
<xs:element ref="value" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="graphs">
<xs:complexType>
<xs:sequence>
<xs:element name="graph" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element ref="value" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="gid" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
和sample.cs
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.5446
//
// 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=2.0.50727.3038.
//
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=true)]
public partial class value {
private string xidField;
private string colorField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string xid {
get {
return this.xidField;
}
set {
this.xidField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string color {
get {
return this.colorField;
}
set {
this.colorField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[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 chart {
private object[] itemsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("graphs", typeof(chartGraphs), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("series", typeof(value[]), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("value", typeof(value), IsNullable=true)]
public object[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class chartGraphs {
private chartGraphsGraph[] graphField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("graph", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public chartGraphsGraph[] graph {
get {
return this.graphField;
}
set {
this.graphField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class chartGraphsGraph {
private value[] valueField;
private string gidField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("value", IsNullable=true)]
public value[] value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string gid {
get {
return this.gidField;
}
set {
this.gidField = value;
}
}
}
它有点乱,但为您节省了大量的时间和精力。
答案 2 :(得分:1)
示例Xml:
<chart>
<series>
<value xid="0">0</value>
<value xid="0">0</value>
<value xid="0">0</value>
</series>
<graphs>
<graph gid="1">
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
</graph>
<graph gid="1">
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
</graph>
<graph gid="1">
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
<value xid="0" color="0">0</value>
</graph>
</graphs>
</chart>
类别:
[XmlRoot("chart")]
public class BarChartSeriesEntity
{
[XmlElement("series")]
public BarChartSeriesValue[] SeriesValues { get; set; }
[XmlElement("graphs")]
public BarChartGraphsValue[] GraphsValues { get; set; }
public class BarChartSeriesValue
{
[XmlElement("value")]
public SeriesValueEntity[] Values { get; set; }
}
public class SeriesValueEntity
{
[XmlAttribute("xid")]
public string Xid { get; set; }
[XmlText]
public string Value { get; set; }
}
public class BarChartGraphsValue
{
[XmlElement("graph")]
public BarChartGraphValue[] Graphs { get; set; }
}
public class BarChartGraphValue
{
[XmlAttribute("gid")]
public string Gid { get; set; }
[XmlElement("value")]
public GraphValueEntity[] Values { get; set; }
}
public class GraphValueEntity
{
[XmlAttribute("xid")]
public string Xid { get; set; }
[XmlAttribute("color")]
public string Color { get; set; }
[XmlText]
public string Value { get; set; }
}
}