0

を使用して次の構造をシリアル化するにはどうすればよいですかXmlSerializer

  1. の 1 つのインスタンスのみProduct

  2. の 1 つのインスタンスのみUpdates

  3. Updates複数含むことができますItem

  4. Item複数含むことができますArtifact

XML:

<Product>
    <Cycle Type = "x0446" />
    <Brand Type = "z773g" Include="All" />
    <Updates>
        <Item Name = "Foo">
            <Artifact Kind="6" Action="3" />
        </Item>
        <Item Name = "Bar">
            <Artifact Kind="6" Action="3" />
            <Artifact Kind="53" Action="3" />
        </Item>
    </Updates>
</Product>
4

4 に答える 4

3

配列またはリスト プロパティで [XmlElement] 属性を使用できます。XmlSerializer は、それを取得して xml に次々とリストするのに十分スマートです。

また

より複雑な構造には、Visual Studio XML-to-class ジェネレーターを使用できます。 - Windows のスタート メニューをクリックします。 - [すべてのプログラム] をクリックします。 - Microsoft Visual Studio フォルダーを見つけてクリックします。 - Visual Studio Tools フォルダーをクリックします。 - Developer Command Prompt をクリックします。 .. - XML が C:\test\Sample.xml に保存されているとしましょう - 「xsd C:\test\Sample.xml /out:C:\test」と入力すると、スキーマが作成されたことがわかります。- 「xsd C:\test\Sample.xsd /c /out:C:\test」と入力すると、.cs クラスが作成されたことが通知されます。ソリューションにコピーし、場合によっては名前空間を変更します (または xsd コマンドを使用します)。パラメーター) - 作成されたクラスは奇妙な名前が付けられ、操作がより困難になる可能性があります。複雑な XML またはスキーマがある場合は、この方法を使用してください。-生成されたコードを部分クラスで拡張できます(調べてください)。

--

直接コード (生成されない) は次のようになります。

public class Product{
    [XmlElement]
    public Cycle Cycle {get;set;}

    [XmlElement]
    public Brand Brand {get;set;}

    [XmlElement]
    public Updates Updates {get;set;}
}

public class Updates{
    [XmlElement("Item")]
    public UpdateItem[] Items{get;set;}
}

public class UpdateItem{ 
    [XmlAttribute]
    public string Name{get;set;} // use [XmlAttribute] in Cycle, Brand and Artifact classes

    [XmlElement("Artifact")]
    public Artifact[] Artifact{get;set;} 
}
//.... etc

生成されたコードは次のようになります。

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

private ProductUpdatesItemArtifact[] artifactField;

private string nameField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Artifact", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public ProductUpdatesItemArtifact[] Artifact {
    get {
        return this.artifactField;
    }
    set {
        this.artifactField = value;
    }
}

[/コード]

于 2012-12-03T17:33:45.120 に答える
2

attributes を使用して xml シリアライゼーションを制御できます。属性を使用XmlAttributeして、要素としてのデフォルトのシリアル化を属性としてのシリアル化に変更します。属性を使用XmlElementして、リストを xml 要素のフラット シーケンスとしてシリアル化します。

public class Product
{
    public Cycle Cycle { get; set; }
    public Brand Brand { get; set; }
    public List<Item> Updates { get; set; }
}

public class Cycle
{
    [XmlAttribute("Type")]
    public string Type { get; set; }    
}

public class Brand
{
    [XmlAttribute("Type")]
    public string Type { get; set; }
    [XmlAttribute("Include")]
    public string Include { get; set; }
}

public class Item
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlElement("Artifact")]
    public List<Artifact> Artifacts { get; set; }
}

public class Artifact
{
    [XmlAttribute("Kind")]
    public int Kind { get; set; }
    [XmlAttribute("Action")]
    public int Action { get; set; }
}

シリアライゼーション:

Product p = new Product()
{
    Cycle = new Cycle() { Type = "x0446" },
    Brand = new Brand() { Type = "z773g", Include = "All" },
    Updates = new List<Item>()
    {
        new Item() { Name = "Foo", 
                     Artifacts = new List<Artifact>() {
                        new Artifact() { Action = 3, Kind = 6 }
                    }
        },
        new Item() { Name = "Bar", 
                     Artifacts = new List<Artifact>() {
                        new Artifact() { Action = 3, Kind = 6 },
                        new Artifact() { Action = 3, Kind = 53 },
                    }
        }
    }
};

XmlSerializer serializer = new XmlSerializer(typeof(Product));
Stream stream = new MemoryStream(); // use whatever you need
serializer.Serialize(stream, p);

結果:

<Product>
    <Cycle Type = "x0446" />
    <Brand Type = "z773g" Include="All" />
    <Updates>
        <Item Name = "Foo">
            <Artifact Kind="6" Action="3" />
        </Item>
        <Item Name = "Bar">
            <Artifact Kind="6" Action="3" />
            <Artifact Kind="53" Action="3" />
        </Item>
    </Updates>
</Product>
于 2012-12-03T16:48:04.403 に答える
0

この構造の XML スキーマを持っている (または生成できる) 場合は、XSD.exe を使用してクラスを生成することをお勧めします。

于 2012-12-03T17:34:34.670 に答える
0

ここにいくつかのコード(1つのプロパティが抜けていました)

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;

[Serializable]
[XmlRoot("Product")]
public class Product
{
    [XmlElement("Cycle")]
    public Cycle Cycle { get; set; }

    [XmlElement("Updates")]
    public Updates Updates { get; set; }

    public Product()
    {
        Cycle = new Cycle();
        Updates = new Updates();
    }
}

[Serializable]
public class Cycle
{
    [XmlAttribute("Type")]
    public string Type { get; set; }
}

[Serializable]
public class Updates
{
    [XmlElement("Item")]
    public List<Item> Items { get; set; }

    public Updates()
    {
        Items = new List<Item>();
    }
}

[Serializable]
public class Item
{
    [XmlElement("Artifact", typeof(Artifact))]
    public List<Artifact> Artifacts { get; set; }

    public Item()
    {
        Artifacts = new List<Artifact>();
    }
}

[Serializable]
public class Artifact
{
    [XmlAttribute("Kind")]
    public int Kind { get; set; }
}

シリアル化のコードはこちら

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.IO;
using System.Text;

    private static string SerializeMe(object o)
    {
        XmlSerializer s = new XmlSerializer(o.GetType());

        MemoryStream stream = new MemoryStream();

        XmlWriter writer = new XmlTextWriter(stream, Encoding.Default);

        s.Serialize(writer, o);

        stream.Flush();

        stream.Seek(0, SeekOrigin.Begin);

        return Encoding.Default.GetString(stream.ToArray());
    }

ここでコンソール上のテストコード

    static void Main(string[] args)
    {
        Product p = new Product();

        p.Cycle.Type = "whatever";

        Item i = new Item();
        i.Artifacts.Add(new Artifact{Kind = 45});

        p.Updates.Items.Add(i);

        Console.WriteLine(SerializeMe(p));

        Console.ReadLine();
    }

お役に立てれば :)

于 2012-12-03T16:43:53.673 に答える