2012-06-05 21 views
2

這裏創建對象是我的問題:讀取XML文件使用LINQ與IEnumerable的歡迎使用屬性

我有這個XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<settings> 
    <app name="Application1"> 
    <log name="Log1" path="d:\paths\" filename="Log1File"/> 
    <log name="Log2" path="d:\paths\"/> 
    <log name="log3" path="d:\paths\" filename="Log3File"/> 
    </app> 
</settings> 

我試圖使用LINQ讀它,並創建對象這個類:但是

public class Apps 
    { 
    public string Name { get; set; } 
    public IEnumerable<Logs> Logs { get; set; } 
    } 

    public class Logs 
    { 
    public string Name { get; set; } 
    public string Path { get; set; } 
    public string Filename { get; set; } 
    } 

到目前爲止,我設法創造這段代碼看起來只得到第一個日誌元的平均時間我需要爲每個應用程序元素中的所有日誌內容:

public static IEnumerable<Apps> GetAllApps() 
    { 
     var items = from a in db.Descendants("app") 
        orderby a.Attribute("name").Value 
        select new Apps 
        { 
        Name = a.Attribute("name").Value, 
        Logs = from b in a.Descendants("log") 
          select new Logs 
          { 
          Name = b.Attribute("name").Value, 
          Path = b.Attribute("path").Value, 
          Filename = b.Attribute("filename").Value 
          } 
        }; 

     return items; 
    } 
+0

什麼是錯誤? –

回答

0

我用流利的API,而是讓你適應,你更喜歡...

問題是一個NullReferenceException,因爲在你的日誌之一xml沒有「文件名」屬性。當你在null上使用「Value」時,你會得到一個NRE。

因此,在試圖獲取它的值之前檢查屬性是否存在。

var it = db.Descendants("app") 
        .OrderBy(app => app.Attribute("name").Value) 
        .Select(app => new Apps() { 
         Name = app.Attribute("name").Value, 
         Logs = app.Descendants("log").Select(a => 
          new Logs() { 
           Name = a.Attribute("name") != null ? a.Attribute("name").Value : null, 
           Path = a.Attribute("path") != null ? a.Attribute("path").Value : null, 
           Filename = a.Attribute("filename") != null ? a.Attribute("filename").Value : null 
          }).ToList() 
        }).ToList(); 
+0

謝謝,就是這樣 – Rafal

3

我會用系列化這裏

XmlSerializer ser = new XmlSerializer(typeof(Settings)); 
var result = (Settings)ser.Deserialize(stream); 

[XmlRoot("settings")] 
public class Settings 
{ 
    [XmlElement("app")] 
    public Apps[] apps; 
} 


public class Apps 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlElement("log")] 
    public Logs[] Logs { get; set; } 
} 

public class Logs 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("path")] 
    public string Path { get; set; } 
    [XmlAttribute("filename")] 
    public string Filename { get; set; } 
} 
+0

這通常是更好的解決方案。如果您擁有穩定/適當的xml架構,您甚至可以使用xsd.exe生成樣板代碼。由於默認情況下會生成部分類,因此可以讓它們實現域接口,從而進一步減少實際xml代碼中的依賴關係。 – mbx