Связать атрибут XML со свойством класса

1

Я создаю приложение MVC в С# и в настоящее время работаю над методом загрузки XML-документа в поток файлов и перебора узлов и сохранения данных в объекты модели.

Все работает нормально, но я жестко кодирую отношения между свойством объекта и именем атрибута xml. Мне было интересно, есть ли умный способ связать два, чтобы я мог запускать все это через каждый цикл.

Это код, который у меня есть сейчас, и он работает, но я хотел бы сделать его более общим

СТАРЫЙ КОД

var xmlDoc = LoadXmlFileIntoStream("WSAPayCode.xml");

                var elementCollection = ExtractDescendants(xmlDoc, "WSAPayCode");



                foreach (var element in elementCollection)
                {

                    var abbreviationChar = element.Attribute("AbbreviationChar");

                    var payCode = new PayCode
                    {
                        Name = element.Attribute("Name").Value,
                        AutoResolved = element.Attribute("AutoResolved").Value.IsBool(),
                        EditExcuseAbsn = element.Attribute("EditExcuseAbsn").Value.IsBool(),
                        PersistPceSw = element.Attribute("PersistPceSw").Value.IsBool(),
                        AbbreviationChar = (string)element.Attribute("AbbreviationChar"),
                        EditCntToCdotSw = element.Attribute("EditCntToCdotSw").Value.IsBool(),
                        EditAffShfTotal = element.Attribute("EditAffShfTotal").Value.IsBool(),
                        EditCntToOt = element.Attribute("EditCntToOt").Value.IsBool(),
                        PayUsingWeightedAverageRate = element.Attribute("PayUsingWeightedAverageRate").Value.IsBool(),
                        RequiresMgrApproval = element.Attribute("RequiresMgrApproval").Value.IsBool(),
                        WeightedAverageRateIsComputedDaily =
                            element.Attribute("WeightedAverageRateIsComputedDaily").Value.IsBool(),
                        JustAutoResExpAsWorked = element.Attribute("JustAutoResExpAsWorked").Value.IsBool(),
                        AssociatedDurationPayCodeName = element.Attribute("AssociatedDurationPayCodeName").Value,
                        WeightedAverageRateContributionsUseAnAdjustedRate =
                            element.Attribute("WeightedAverageRateContributionsUseAnAdjustedRate").Value.IsBool(),
                        ScheduleHoursType = element.Attribute("ScheduleHoursType").Value,
                        CheckAvlbltySw = element.Attribute("CheckAvlbltySw").Value.IsBool(),
                        WageAddition = (string)element.Attribute("WageAddition"),
                        VisibleInMainArea = element.Attribute("VisibleInMainArea").Value.IsBool(),
                        IsMoneyCategory = element.Attribute("IsMoneyCategory").Value.IsBool(),
                        AmountType = element.Attribute("AmountType").Value,
                        VisibleInReport = element.Attribute("VisibleInReport").Value.IsBool(),
                        ContributesToWeightedAverageRates =
                            element.Attribute("ContributesToWeightedAverageRates").Value.IsBool(),
                        UnjustAutoResExpAsWorked = (bool)element.Attribute("UnjustAutoResExpAsWorked"),
                        WageMultiply = (string)element.Attribute("WageMultiply"),
                        Type = (string)element.Attribute("Type"),
                        VisibleToUser = (bool)element.Attribute("VisibleToUser"),
                        CustomerId = _customerId,
                    };

                    _db.PayCodes.Add(payCode);
                    _db.SaveChanges();

                }

Новый код Я написал некоторый код для взаимодействия через XML файл и вытащил имена атрибутов - Code Below (также работает)

var xmlDoc = LoadXmlFileIntoStream("WSAPayCode.xml");

                    var elementCollection = ExtractDescendants(xmlDoc, "WSAPayCode");

                    var nodeAttributes = xmlDoc.Descendants("WSAPayCode").Select(x => x.Attributes());

                    foreach (var attrs in nodeAttributes)
                    {
                        var _attribute = "";
                        foreach (var attr in attrs)
                        {
                            // This successfully reads through each attribute and pulls out the name of the attribut
                            _attribute = attr.Name.ToString();
                        }

                    }

Проблема, которую я хотел бы решить

Теперь я хотел бы создать экземпляр объекта и перебрать имена атрибутов и сохранить значения в соответствующем свойстве объекта. т.е. заменить OLD-код на то, что динамически присваивает значения свойствам объекта.

Теги:
asp.net-mvc

1 ответ

0

Я хотел бы проверить использование XML-сериализаторов/десериализаторов. На вашем классе у вас есть атрибуты относительно того, является ли свойство элементом или атрибутом, а затем разрешает ему обрабатывать остальную часть для вас.

Вы можете установить атрибуты в соответствии с тем, что предоставляет документ XML, например, если имя является элементом или атрибутом и т.д.

Например:

[XmlRoot("PayCode")]
public class PayCode
{
    [XmlElement("Name")
    public string Name { get; set;}

    ....
}

Затем, чтобы десериализовать объект:

XmlSerializer serializer = new
XmlSerializer(typeof(PayCode));

FileStream fs = new FileStream(filename, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);

PayCode payCode = (PayCode)serializer.Deserialize(reader);
  • 0
    Спасибо - я не уверен, как это помогает мне связать каждый атрибут с каждым свойством.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню