2011-08-23 18 views
-1

我需要创建以下XML并希望通过XmlSerialization创建它,因此可以通过对象动态生成数据本身。Xml序列化 - 创建对象层次结构以实现预定义的xml结构

<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 PM PST
当我说,这是完全错误的,所有我需要做的就是看看它实现了数据结构不会映射到所需的XML。真正抛出我的部分是嵌套图结构。
我以前不知道如何通过XSD从XML生成类。它看起来非常有用和有用。
感谢所有谁提供的解决方案

+4

*“不完全工作(实际上,其中的一部分显然是错误的)”* - **什么**不起作用? **“什么**是”显然是错的?“ – cdhowie

+2

为什么不从xml生成xsd,然后使用xsd生成类。 xsd.exe是你的朋友。 – Phill

回答

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"); 
    } 
} 
+0

我错过了XmLArrayItem值,但我修复了它。 – Rhyous

+0

我错过了gid。 – Rhyous

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; } 
    } 
} 
2

您可以使用XSD.exe生成类,我认为它是Visual Studio的一部分。

如果打开Visual Studio命令提示符,您可以访问它。

  1. 在硬盘的某个地方创建一个物理XML文件。 (我用了你的XML和装箱sample.xml中)

  2. 打开Visual Studio命令提示符

  3. 导航到该目录

  4. 型 'XSD sample.xml中'(不带引号),这将生成(没有引号)在 'XSD sample.xsd/C' sample.xsd

  5. 类型,这将产生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> 

和样品。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; 
     } 
    } 
} 

这有点麻烦,但为您节省了大量的时间和精力。