I am trying to extract data from XML file and save it my C# class/object. My problem is
I have an XMl file like this
<personal_auto xmlns = "http://cp.com/rules/client">
<claim id = "s1" type = "Subject Section">
<report >
</report>
<policy>
</policy>
</claim>
<claim id = "s2" type = "Vehichle Section">
<report >
</report>
<policy>
</policy>
</claim>
<claim id = "s3" type = "Agent Section">>
<report
</report>
<policy>
</policy>
</claim>
</personal_auto>
I have 开发者_高级运维an enum like this
public enum typesectionEnum
{
[Description("Subject Section")]
subjectSection,
[Description("Vehicle Section")]
vehicleSection,
[Description("Possible Related Section")]
possibleRelatedSection,
[Description("Agent (Summary) Section")]
AgentSection
}
I am trying to extract data from the XML file and save to my C# class/object.
List<claim> = ( from d in query.Descendants(xmlns + "claim")
select new Claim
{
id = d.Attribute("id").value,
type = ????
}
).ToList (),
What I am wondering is, I want to set the value in my application that will access the value in the xml file.
If the DescriptionAttribute
s matches exactly with the type attribute strings in the XML you can use reflection.
Edit: convert to generic
public TEnum GetEnum<TEnum>(string input) where TEnum : struct
{
if (!typeof(TEnum).IsEnum)
throw new Exception(typeof(TEnum).GetType() + " is not en enum");
Type dataType = Enum.GetUnderlyingType(typeof(typesectionEnum));
foreach (FieldInfo field in
typeof(typesectionEnum).GetFields(BindingFlags.Static | BindingFlags.GetField |
BindingFlags.Public))
{
object value = field.GetValue(null);
foreach (DescriptionAttribute attrib in field.GetCustomAttributes(true).OfType<DescriptionAttribute>())
{
if (attrib.Description == input)
{
return (TEnum)value;
}
}
}
return default(TEnum);
}
and then call it like this:
select new Claim
{
id = d.Attribute("id").value,
type = GetEnum<typesectionEnum>(d.Attribute("type").value),
}
List<claim> claims = (
from d in query.Descendants(xmlns + "claim")
let t = d.Attribute("type").Value
select new Claim
{
id = d.Attribute("id").value,
type = t == "Subject Section" ? typesectionEnum.subjectSection :
(t == "Vehicle Section" ? typesectionEnum.vehicleSection :
(t == "Possible Related Section" ? typesectionEnum.possibleRelatedSection :
typesectionenum.AgentSection))
}
).ToList ();
精彩评论