2013-02-13 1 views
2
var doc3 = XDocument.Load(@"C:\Projects\ScanBandConfigTesting\ScanBandConfigTesting\ScanBandConfigSmall.xml"); 

var scanBand = new ScanBand() 
{ 
    ListOfForms = (from form in doc3.Descendants("form") 
        select new ScanBandForm() 
        { 
         FormTypes = form.Attribute("types").Value, 
         ScanBandNumber = form.Attribute("number").Value, 
         ListOfRows = (from row in form.Descendants("row") 
             select new ScanBandRow() 
             { 
              AllowSpaces = row.Element("allowSpaces").Value.ToLower() == "true", 
              SplitCharacter = row.Element("splitCharacter").Value, 
              ListOfColumns = (from column in row.Descendants("column") 
                  select new ScanBandColumn() 
                  { 
                   AlwaysKey = column.Element("allwaysKey").IsEmpty ? false : column.Element("allwaysKey").Value.ToLower() == "true", 
                   DataTypeString = column.Element("dataType").IsEmpty ? string.Empty : column.Element("dataType").Value, 
                   MatchingFieldName = column.Element("matchingFieldName").IsEmpty ? string.Empty : column.Element("matchingFieldName").Value, 
                   NonField = column.Element("nonField").IsEmpty ? false : column.Element("nonField").Value.ToLower() == "true", 
                   RegularExpressionString = column.Element("regularExpression").IsEmpty ? string.Empty : column.Element("regularExpression").Value, 
                  }).ToList() 
             }).ToList() 
        }).ToList() 
}; 

XMLLinq в Object/XML, где элемент не существует

<scanBand> 
    <form types="FormName" number="1"> 
    <row> 
     <allowSpaces>false</allowSpaces> 
     <splitCharacter>&#32;</splitCharacter> 
     <column> 
     <matchingFieldName>FirstField</matchingFieldName> 
     <dataType>CB</dataType> 
     <regularExpression></regularExpression> 
     <allwaysKey>false</allwaysKey> 
     <nonField>false</nonField> 
     </column> 
     <column> 
     <matchingFieldName>SecondField</matchingFieldName> 
     <dataType>CB</dataType> 
     <regularExpression></regularExpression> 
     <allwaysKey>false</allwaysKey> 
     <nonField>false</nonField> 
     </column> 
     <column> 
     <matchingFieldName>ThirdField</matchingFieldName> 
     <dataType>CB</dataType> 
     <regularExpression></regularExpression> 
     <!--<allwaysKey></allwaysKey>--> 
     <nonField>true</nonField> 
     </column> 
    </row> 
    </form> 
</scanBand> 

Цель состоит, чтобы это не удар, когда один из элементов в файле .xml не существует. Я попытался поиграть с .Any(), но не был успешным.

Я предпочел бы не перебирать с помощью Еогеасп и предпочел бы придерживаться ж/LINQ

Любая помощь очень ценится

+0

Я хотел бы контролировать, что элемент, если он не существует. Например, false или string.Empty, если в файле конфигурации .xml нет ничего для этого свойства/элемента. – bizah

ответ

5

Не используйте Value свойство, чтобы получить значение атрибута или элемента. Если узел отсутствует, вы получите исключение. Когда вы набрасываете узел (например, на строку), вы получите значение по умолчанию для этого типа, если узел отсутствует. Также вы можете использовать оператор ?? для предоставления собственного значения по умолчанию для отсутствующих узлов строки (по умолчанию вы получите null).

result = (string)column.Element("dataType") ?? String.Empty 

же трюк используется с булевыми значениями - я получаю Nullable<bool> и если это null (узел отсутствует), то я задаю false, если это не null, то значение узла успешно назначен Ненулевые собственности:

ListOfForms = 
    (from form in doc3.Descendants("form") 
     select new ScanBandForm() { 
      FormTypes = (string)form.Attribute("types"), 
      ScanBandNumber = (string)form.Attribute("number"), 
      ListOfRows = 
       (from row in form.Descendants("row") 
       select new ScanBandRow() { 
        AllowSpaces = (bool?)row.Element("allowSpaces") ?? false, 
        SplitCharacter = (string)row.Element("splitCharacter"), 
        ListOfColumns = 
         (from column in row.Descendants("column") 
         select new ScanBandColumn() { 
          AlwaysKey = (bool?)column.Element("allwaysKey") ?? false, 
          DataTypeString = (string)column.Element("dataType") ?? String.Empty, 
          MatchingFieldName = (string)column.Element("matchingFieldName") ?? String.Empty, 
          NonField = (bool?)column.Element("nonField") ?? false, 
          RegularExpressionString = (string)column.Element("regularExpression") ?? String.Empty, 
         }).ToList() 
       }).ToList() 
     }).ToList(); 
Смежные вопросы