Сериализация Xml - создание иерархии объектов для достижения предварительно определенной структуры XML - PullRequest
0 голосов
/ 23 августа 2011

Мне нужно создать следующий 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 23:24 PST
Когда я сказал, что это просто неправильно, все, что мне нужно было сделать, это посмотреть на это и понять,что структуры данных не будут отображаться в желаемый XML.Часть, которая действительно бросила меня, была структура вложенных графов.
Раньше я не знал о генерации классов из XML через XSD.Это выглядит очень полезным и полезным.
Спасибо всем, кто предоставил решения

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Вот быстрый проект.

Я использую этот класс или его вариант: Общий класс XML-сериализатора для C # и пример использования XML-сериализации

Тогда вот код, который вам нужен.

[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");
    }
}
2 голосов
/ 23 августа 2011

Вы можете создать класс с помощью XSD.exe, который (я думаю) поставляется как часть visual studio.

Если вы откроете командную строку Visual Studio, вы сможете получить к ней доступ.

  1. Создать где-нибудь физический файл XML на жестком диске.(Я использовал ваш xml и crated sample.xml)

  2. Открытие командной строки Visual Studio

  3. Перейдите в каталог

  4. введите «xsd sample.xml» (без кавычек), это сгенерирует sample.xsd

  5. введите «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;
        }
    }
}

Это немного грязно, но экономит много времени и усилий.

1 голос
/ 23 августа 2011

Пример 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; }
    }
}
...