私は次のような単一の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; }
}
このXElement
をProductAttribute
オブジェクトに変換するにはどうすればよいですか?
クラスとクラスメンバーに正しいシリアル化属性を設定する必要があります
[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; }
}
あなたはこのようにすることができます:
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);
お役に立てば幸いです。
やってみました:
XElement element = //Your XElement
var serializer = new XmlSerializer(typeof(ProductAttribute));
(ProductAttribute)serializer.Deserialize(element.CreateReader())
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でその属性を検索してから、ほぼ同じ方法でそのプロパティを設定できます。ただし、オブジェクトは複雑ではないので、単純にしておきます。
これはかなり簡単なようです(少なくともエラーチェックなしで...):
var res = new ProdicAttribute {
Flag = (string)element.Attribute("flag"),
Sect = (string)element.Attribute("sect"),
...
}
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
として入力する必要があるとは思いません。