Извлечение данных из XML в объект C # с использованием LINQ to XML, Enums - PullRequest
2 голосов
/ 22 сентября 2010

Я пытаюсь извлечь данные из файла XML и сохранить его в своем классе / объекте C #.У меня проблема

У меня есть файл XMl, подобный этому

<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> 

У меня есть такое перечисление

    public enum typesectionEnum
    {
        [Description("Subject Section")]
        subjectSection,
        [Description("Vehicle Section")]
        vehicleSection,
        [Description("Possible Related Section")]
        possibleRelatedSection,
        [Description("Agent (Summary) Section")]
        AgentSection
    }

Я пытаюсь извлечь данные из файла XMLи сохраните в моем классе / объекте C #.

List<claim> = ( from d in query.Descendants(xmlns + "claim")
                 select new Claim 
                   {
                    id = d.Attribute("id").value,
                    type = ????                    
                    }
                 ).ToList (),

Что мне интересно, так это то, что я хочу установить значение в своем приложении, которое будет обращаться к значению в XML-файле.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2010

Если DescriptionAttribute s точно совпадает со строками атрибутов типа в XML, вы можете использовать отражение.

Редактировать: преобразовать в общий

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);
}

и затем назовите это так:

select new Claim 
{
    id = d.Attribute("id").value,
    type = GetEnum<typesectionEnum>(d.Attribute("type").value),
}
3 голосов
/ 22 сентября 2010
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 ();
...