2010-05-13 121 views
3

我有以下XML:如何通過LINQ創建詞典<int, string>到XML?

<FootNotes> 
    <Line id="10306" reference="*"></Line> 
    <Line id="10308" reference="**"></Line> 
    <Line id="10309" reference="***"></Line> 
    <Line id="10310" reference="****"></Line> 
    <Line id="10311" reference="+"></Line> 
</FootNotes> 

和我有下面的代碼,我得到一個Dictionary<int, string>()對象爲

myObject.FootNotes 

使每一行是鍵/值對

var doc = XElement.Parse(xmlString); 

var myObject = new 
    { 
     FootNotes = (from fn in doc 
         .Elements("FootNotes") 
         .Elements("Line") 
         .ToDictionary 
         (
         column => (int) column.Attribute("id"), 
         column => (string) column.Attribute("reference") 
         ) 
       ) 
    }; 

我不確定如何從XML到對象中。任何人都可以提出解決方案

回答

6

你的代碼幾乎是正確的。試試這個微小的變化,而不是:

FootNotes = (from fn in doc.Elements("FootNotes") 
          .Elements("Line") 
      select fn).ToDictionary(
       column => (int)column.Attribute("id"), 
       column => (string)column.Attribute("reference") 
      ) 

我不認爲從長遠from ... select語法真的幫助很多在這裏。我會使用這個稍微簡單的代碼來代替:

Footnotes = doc.Descendants("Line").ToDictionary(
       e => (int)e.Attribute("id"), 
       e => (string)e.Attribute("reference") 
      ) 

但是,您在示例代碼中使用了匿名類型。如果您打算將此對象返回給調用者,則需要使用具體類型。

var myObject = new SomeConcreteType 
    { 
     Footnotes = .... 
    }; 
+0

該代碼是_almost_正確的,除了'(從fn in和尾部')'。您在編輯之前提供的示例指出了這一點。你應該恢復最後一次編輯,所以我可以選擇這個作爲正確的答案 – DaveDev 2010-05-13 16:25:47

+0

@DaveDev:我其實現在也添加了:) – 2010-05-13 16:27:41