【问题标题】:How do I select XML elements into a strongly-typed collection using LINQ?如何使用 LINQ 将 XML 元素选择到强类型集合中?
【发布时间】:2011-02-23 09:56:45
【问题描述】:

我正在努力思考如何使用 LINQ 作为处理 XML 数据的一种方式,但在找出将元素选择到强类型集合中的最佳方法时遇到了问题。我确定我缺少一些微小的细节,但我似乎看不到它。

这是我的 XML 文件的示例:

    <users>
      <User>
        <UserId>a3ba555e-9dbe-4f5e-a8b0-56be91a99eae</UserId>
        <Password>FCC2427123934BC2A06297847574A50E</Password>
        <Username>TestTEst</Username>
        <FirstName>Test</FirstName>
        <LastName>TestTEst</LastName>
      </User>
      <User>
        <UserId>500629d5-c22a-4585-bc85-330391f44fac</UserId>
        <Password>FCC2427123934BC2A06297847574A50E</Password>
        <Username>TestTEst</Username>
        <FirstName>Test</FirstName>
        <LastName>TestTEst</LastName>
      </User>
      <User>
        <UserId>bd6b78db-9cd7-403b-a757-a8c013bdc523</UserId>
        <Password>FCC2427123934BC2A06297847574A50E</Password>
        <Username>TestTEst</Username>
        <FirstName>Test</FirstName>
        <LastName>TestTEst</LastName>
      </User>
</users>

当我使用以下代码创建对象时:

Dim userList = From u In users.Descendants("user") _
               Select u

然后 userList 将包含我的 XML 文件的元素。如果我尝试将 XML 文件选择为强类型集合:

Dim userList = (From u In users.Descendants("user") _
               Select New User With { _
                   .UserId = New Guid(u.Attribute("UserId").Value), _
                   .Username = u.Attribute("Username").Value, _
                   .Password = u.Attribute("Password").Value, _
                   .FirstName = u.Attribute("FirstName").Value, _
                   .LastName = u.Attribute("LastName").Value _
               }).ToList()

那么 userList 是空的。无论我是否明确指定 userList 的类型 (List(Of User)),这都是一样的。我究竟做错了什么?直接从 XML 创建强类型集合的正确方法是什么?

谢谢,

迈克

【问题讨论】:

  • 我很惊讶这完全有效。 XML 区分大小写。应该是.Descendants("User")
  • 碰巧这就是问题所在:)。它正在寻找用户而不是用户。一旦我将其更改为“用户”(使用 Descendants 属性),它就工作得很好。

标签: xml linq collections


【解决方案1】:

我认为您的问题是“用户 ID”、“用户名”、“密码”等不是用户标签的属性,它们是子元素。可能想试试这个:

Dim userList = (From u In users.Descendants("user") _
               Select New User With { _
                   .UserId = New Guid(u.Decendants("UserId").First().Value), _
                   .Username = u.Decendants("Username").First().Value, _
                   .Password = u.Decendants("Password").First().Value, _
                   .FirstName = u.Decendants("FirstName").First().Value, _
                   .LastName = u.Decendants("LastName").First().Value _
               }).ToList()

【讨论】:

  • 我尝试使用带和不带 .First() 的 Descendants 并得到相同的结果。
  • 如上所述,主要问题是“用户”应该是“用户”,因为这是 XML 文件中元素的大小写。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多