2010-11-19 8 views
1

ここにはhttp://pastie.org/1311506のような形式のXMLがあります(コメントパーサーがタグを削除するため、ここには挿入しません)。私は(:http://pastie.org/1311514ここのような)type呼ば<cars>ノードに追加の属性を必要とするXmlArrayAttributeでマークされたコレクションに属性を追加する方法は?

[XmlRoot("products")] 
public class Products 
{ 
    [XmlElement("label")] 
    public string Label { get; set; } 

    [XmlArray("cars")] 
    [XmlArrayItem("car")] 
    public Car[] Cars { get; set; } 
} 

public class Car 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
} 

... 

var products = new Products 
        { 
         Label = "1", 
         Cars = new[] 
            { 
             new Car {Name = "BMW"}, 
             new Car {Name = "Volvo"} 
            } 
        }; 
var serializer = new XmlSerializer(typeof(Products)); 
var writer = new StringWriter(); 
serializer.Serialize(writer, products); 
Console.WriteLine(writer); 

このXMLは/ serealizedさは、次のコードを使用して直列化復元しました。どうしたらいいですか?

言い換えれば、2番目のpastieのリンクに示されている形式のXMLを解析するために、データクラス(製品とCar、そしておそらく他のもの)を定義する方法は?

+0

「パーサは、タグを削除」:あなたは、コードとしてそれをフォーマットしない場合は( 4つのスペースでインデントするかCtrl + Kを使用) –

答えて

4

コレクションの場合、XmlSerializerはすべてのメンバーを無視するため、簡単な方法はありません。コレクションのアイテムのみをシリアル化するためです。ただし、逆シリアル化してtype属性を無視するだけの場合は、問題ではありません。不明な属性は無視されます。

typeの値を取得する必要がある場合は、コレクションではなくコレクションを含むクラスを宣言できます。そのような何か:あなたのProductsクラスで

public class Cars 
{ 
    [XmlElement("car")] 
    public Car[] Items { get; set; } 

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

、ただ単にXmlElement属性を持つタイプCarsCarsプロパティを宣言:

[XmlRoot("products")] 
public class Products 
{ 
    [XmlElement("label")] 
    public string Label { get; set; } 

    [XmlElement("cars")] 
    public Cars Cars { get; set; } 
} 
+0

ありがとう、トーマス。 – DNNX

関連する問題