web-dev-qa-db-ja.com

単一のXElementをオブジェクトに変換する

私は次のような単一のXElementを持っています:

<row flag="1" sect="" header="" body="" extrainfo="0" />

次に、次のようなクラスがあります。

public class ProductAttribute
{
    public string Flag { get; set; }
    public string Sect { get; set; }
    public string Header { get; set; }
    public string Body { get; set; }
    public string Extrainfo { get; set; }
}

このXElementProductAttributeオブジェクトに変換するにはどうすればよいですか?

16
Numm3n

クラスとクラスメンバーに正しいシリアル化属性を設定する必要があります

[Serializable()]
[XmlRoot(ElementName = "row")]
public class ProductAttribute
{
    [XmlAttribute("flag")]
    public string Flag { get; set; }
    [XmlAttribute("sect")]
    public string Sect { get; set; }
    [XmlAttribute("header")]
    public string Header { get; set; }
    [XmlAttribute("body")]
    public string Body { get; set; }
    [XmlAttribute("extrainfo")]
    public string Extrainfo { get; set; }
}
15
jbl

あなたはこのようにすることができます:

1)最初に、クラスに属性を与える必要があります。

[XmlRoot("row")]
public class ProductAttribute
{
    [XmlAttribute("flag")]
    public string Flag { get; set; }
    [XmlAttribute("sect")]
    public string Sect { get; set; }
    [XmlAttribute("header")]
    public string Header { get; set; }
    [XmlAttribute("body")]
    public string Body { get; set; }
    [XmlAttribute("extrainfo")]
    public string Extrainfo { get; set; }
}

2)これで、XElementまたは単純なxml文字列を次のように逆シリアル化できます。

ProductAttribute productAttribute = new ProductAttribute();
XElement xElement = XElement.Parse(
"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />");

//StringReader reader = new StringReader(
//"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />");

StringReader reader = new StringReader(xElement.ToString());
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ProductAttribute));
productAttribute = (ProductAttribute)xmlSerializer.Deserialize(reader);

お役に立てば幸いです。

12

やってみました:

XElement element = //Your XElement
var serializer = new XmlSerializer(typeof(ProductAttribute));
(ProductAttribute)serializer.Deserialize(element.CreateReader()) 
7
Alberto

XElementを取り込むコンストラクターを追加します。

public class ProductAttribute
{
    public string Flag { get; set; }
    public string Sect { get; set; }
    public string Header { get; set; }
    public string Body { get; set; }
    public string Extrainfo { get; set; }

    public ProductAttribute(XElement xElement){
        Flag = (string)element.Attribute("flag");
        Sect = (string)element.Attribute("sect").Value;
        Header = (string)element.Attribute("header ").Value;
        Body = (string)element.Attribute("body").Value;
        Extrainfo = (string)element.Attribute("extrainfo").Value;
    }
}

その後、あなたはただ呼び出すことができます

var productAttribute = new ProductAttribute(element);

その動的なものにしたい場合は、リフレクションを使用してクラスのプロパティを取得してからループし、XElementでその属性を検索してから、ほぼ同じ方法でそのプロパティを設定できます。ただし、オブジェクトは複雑ではないので、単純にしておきます。

3
Rob

これはかなり簡単なようです(少なくともエラーチェックなしで...):

var res = new ProdicAttribute {
  Flag = (string)element.Attribute("flag"),
  Sect = (string)element.Attribute("sect"),
  ...
}
1
Richard
var element = XElement.Parse("<row flag="1" sect="" header="" body="" extrainfo="0" />");

var productAttribute = new ProductAttribute {
    Flag = (string)element.Attribute("flag"),
    Sect = (string)element.Attribute("sect"),
    Header = (string)element.Attribute("header"),
    Body = (string)element.Attribute("body"),
    Extrainfo = (string)element.Attribute("extrainfo")
};

しかし、すべてのProductAttributeクラスプロパティをstringとして入力する必要があるとは思いません。

0
MarcinJuraszek