【问题标题】:LINQ to XML using Lambda syntax to populate object collectionLINQ to XML 使用 Lambda 语法填充对象集合
【发布时间】:2017-10-24 23:05:40
【问题描述】:

我正在尝试使用带有 lambda 语法的 LINQ 从 XML 片段加载对象列表,但在创建新对象时遇到了 lambda 语法问题。

这是保存数据的自定义类:

public class PhysicianInfoModel
{
  string FirstName;
  string LastName;
  string Degree;
}

这是我试图从中加载对象集合的示例 XML:

<response>
  <control>
    <status>success</status>
    <dtdversion>3.0</dtdversion>
  </control>
  <operation>
    <authentication>
      <status>success</status>
      <userid>jsmith</userid>
    </authentication>
    <result>
      <status>success</status>
      <physicianlist>
        <physician>
          <lastname degree="MD">Smith</lastname>
          <firstname>Paul</firstname>
        </physician>
        <physician>
          <lastname degree="DO">Smith</lastname>
          <firstname>Paul</firstname>
        </physician>
      </physicianlist>
    </result>
  </operation>
</response>

我曾尝试使用如下代码,但我知道这是不正确的,因为即使是 Visual Studio 中的智能感知也都是“红色波浪线”。在这个例子中,xml 是一个 XDocument 对象,它已经加载了上面列出的 XML。

List<PhysicianInfoModel> nodeList = xml.Descendants("physicianlist")
                                .Descendants("physician")
                                .Select(x => new PhysicianInfoModel()
                                {
                                  FirstName = x.?????,
                                  LastName = x.????,
                                  Degree = x.Attribute("degree") // Not working
                                });

【问题讨论】:

    标签: lambda linq-to-xml


    【解决方案1】:

    x 在您的Select() 上下文中引用单个physician 元素,因此您无法直接从x 获取degree 属性。您需要先获取子 lastname 元素:

    List<PhysicianInfoModel> nodeList = 
                xml.Descendants("physicianlist")
                   .Descendants("physician")
                   .Select(x => new PhysicianInfoModel()
                   {
                       FirstName = (string)x.Element("firstname"),
                       LastName = (string)x.Element("lastname"),
                       Degree = (string)x.Element("lastname").Attribute("degree")
                   })
                   .ToList();
    

    另外,所有的“红色波浪线”都是可能,因为 3 个字段的可见性是 private (default visibility) 所以它是 won't be accessible from outside of the class PhysicianInfoModel,虽然我不能确定是否是这种情况,因为您没有发布实际的错误消息。

    【讨论】:

    • 谢谢!。我错过了x.Element("lastname")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多