2014-03-30 2 views
1

제 3 자 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; 
      } 

답변

2

당신이 null 참조 예외를 방지하기 위해 Value 숙박 시설의 접근 대신 문자열로 XAttribute 캐스팅 할 수 있습니다

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

을두고 당신거야 안전하게 속성 AbbreviationChar 찾을 수없는 경우 null 값을 가져옵니다.