如何通过LINQ to XML创建Dictionary<int, string>?

3

我有以下的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转换为对象。有人可以提供一个解决方案吗?

1个回答

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 = ....
    };

代码几乎是正确的,除了 (from fn in 和结尾的)。在您进行编辑之前提供的示例指出了这一点。您应该撤销最后一次编辑,以便我可以将其选择为正确答案。 - DaveDev
@DaveDev:我实际上现在也加入了 :) - Mark Byers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接