2010-08-20 147 views
3

我有一個XML文件,我想將其轉入POCO對象列表。LINQ to XML to POCO對象

我有以下工作代碼來讀取XML並從中創建對象。我只想檢查這是做這件事的好方法,我不會錯過任何竅門。特別是關於嵌套的Linq查詢。

XDocument xmlDoc = XDocument.Load(path); 
var q = from file in xmlDoc.Descendants("File") 
     select new ImportDefinition() 
     { 
      Name = file.Attribute("Name").Value, 
      TypeName = file.Attribute("TypeName").Value, 
      ColumnMappings = 
      (
       from map in file.Descendants("ColumnMap") 
       select new ColumnMap() 
       { 
        DatabaseColumn = new Column() 
        { 
         Name = map.Element("DatabaseColumn").Attribute("Name").Value 
        } 
       } 
      ).ToList<ColumnMap>()    
     }; 
List<ImportDefinition> def = q.ToList<ImportDefinition>(); 

感謝

回答

3

也許嘗試顯式轉換

public class ColumnMap 
{ 
    public static explicit operator ColumnMap(XElement xElem) 
    { 
     return new ColumnMap() 
     { 
      DatabaseColumn = new Column() 
      { 
       Name = xElem.Element("DatabaseColumn").Attribute("Name").Value 
      } 
     }; 
    } 
} 

public class ImportDefinition 
{ 
    public static explicit operator ImportDefinition(XElement xElem) 
    { 
     return new ImportDefinition() 
     { 
      Name   = (string)xElem.Attribute("Name"), 
      TypeName  = (string)xElem.Attribute("TypeName"), 
      Size   = (int)xElem.Attribute("Size"), 
      LastModified = (DateTime?)xElem.Attribute("LastModified"), 
      ColumnMappings = xElem.Descendants("ColumnMap").Select(xelem => (ColumnMap)xelem).ToList() 
     }; 
    } 
} 

然後使用它像這樣:

XDocument xmlDoc = XDocument.Load(path); 
List<ImportDefinition> importDefinitions = xmlDoc.Descendants("File").Select(xElem => (ImportDefinition)xElem).ToList() 
+0

AFAIK .Cast <>不調用定製的轉換運算符 - 還是呢? – dtb 2010-08-20 17:04:45

+0

@dtb:如果沒有,那麼這是行不通的。沒有測試過,但本來想象它只是一個擴展,它可以像IEnumerable那樣做 Cast (IEnumerable targets){foreach(T target in targets)yield return(U)target; } – 2010-08-20 17:44:07

+1

我相信這正是Enumerable.Cast所做的,因爲轉換爲通用參數'U',afaik不會查找自定義轉換運算符,所以它可能不會工作。但我還沒有測試。 – dtb 2010-08-20 18:26:11

3

如果你的POCO對象不僅有字符串屬性,和的XElement提供XAttribute的conversion operators多種選擇其他類型的,包括在案件nullables元素/屬性不存在。

實施例:

XDocument xmlDoc = XDocument.Load(path); 
var q = from file in xmlDoc.Descendants("File") 
     select new ImportDefinition() 
     { 
      Name   = (string)file.Attribute("Name"), 
      TypeName  = (string)file.Attribute("TypeName"), 
      Size   = (int)file.Attribute("Size"), 
      LastModified = (DateTime?)file.Attribute("LastModified"), 
      // ... 
     };