XML文件结构不一致

时间:2014-03-30 12:38:23

标签: c# xml

我正在从第三方xml文件中读取数据(因此我无法控制这些文件的结构和内容)。

在某些情况下,文件没有一致的元素/属性,因此当我尝试通过文件准备程序时程序崩溃。

无论如何都要检查每次传递时属性是否存在并跳过该属性或将值默认为null,而不跳过整个记录,即我仍然想要其余的字段。

注释掉的属性是当前并不总是出现在每个记录中的属性,即AbbreviationChar将出现在xml文件的前30个记录中,但是第31个记录不会将其列为属性,然后在记录32上显示试。

public IEnumerable<KronosPayCode> ImportPayCodes()
        {
            var processingOrder = _db.KronosConfigurationFiles.ToList();

            if (!processingOrder.Any()) return null;
            var xmlFile = Path.Combine(_xmlPath, "WSAPayCode.xml");
            var stream = new FileStream(xmlFile, FileMode.Open, FileAccess.Read);
            var xdoc = XDocument.Load(stream);
            var payCodeCollection = xdoc.Descendants("WSAPayCode");
            var kronosCollection = new List<KronosPayCode>();
            foreach (var element in payCodeCollection)
            {
                var abbreviationChar = element.Attribute("AbbreviationChar");
                var payCode = new KronosPayCode
                {
                    Name = element.Attribute("Name").Value,
                    AutoResolved = element.Attribute("AutoResolved").Value.IsBool(),
                    EditExcuseAbsn = element.Attribute("EditExcuseAbsn").Value.IsBool(),
                    PersistPceSw = element.Attribute("PersistPceSw").Value.IsBool(),
                    //AbbreviationChar=element.Attribute("AbbreviationChar").Value,
                    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=element.Attribute("WageAddition").Value,
                    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=element.Attribute("UnjustAutoResExpAsWorked").Value.IsBool(),
                    //WageMultiply=element.Attribute("WageMultiply").Value,
                    //Type=element.Attribute("Type").Value,
                    //VisibleToUser=element.Attribute("VisibleToUser").Value.IsBool(),
                    CustomerId = 11,
                };

                _db.KronosPayCodes.Add(payCode);
                _db.SaveChanges();
                kronosCollection.Add(payCode);
                }

                return kronosCollection;
            }

1 个答案:

答案 0 :(得分:2)

您可以将XAttribute转换为字符串,而不是访问它的Value属性以避免空引用异常:

........
AbbreviationChar = (string)element.Attribute("AbbreviationChar"),
........

如果找不到属性null,那么您 安全地获取AbbreviationChar值。