【问题标题】:Linq on Complex XML复杂 XML 上的 Linq
【发布时间】:2015-12-01 19:36:17
【问题描述】:

您好,我有以下 XML

<Feed>
<Control>
        <Username>Fnol13</Username>
        <Password>12345</Password>          
</Control>
<Repairer>
        <RepairerName>Test</RepairerName>
        <RepairerAddress>Test</RepairerAddress>
        <RepairerTelephone>Test</RepairerTelephone>
</Repairer>
</Feed>

还有一个包含以下属性的模型类

[Serializable]
public  class Job {

    public string Username { get; set; }

    public string Password { get; set; }

    public string Reference { get; set; }

    public string RepairerAddress { get; set; }

    public string RepairerTelephone { get; set; }


}   

我正在使用以下 Linq 查询从 XML 中提取数据

var results = from job in xmlDoc.Descendants("Control")
                      select new Job {
                          Username = (string)job.Element("Username").Value,
                          Password = (string)job.Element("Password").Value


                      };
// Here I want to add as well Descendants("Repairer") using same query

        return results.ToList();

问题是可以返回 Descendants("Control") 但是我也想获得 Descendants("Repairer") 并返回与我的模型显示的相同列表中。你能帮我写一下 Linq Query,我向你确认我是 Linq 的新手。

【问题讨论】:

标签: c# xml linq


【解决方案1】:

您的模型 Job 让我感到困惑,因为您可能有多个 Control & Repairer 节点在这种情况下它应该映射到一个集合。无论如何,对于当前的 XML,我假设您需要第一个 Repairer 节点的元素,您可以像这样实现它:-

var results = from job in xmlDoc.Root.Elements("Control")
              let Repairer = job.Parent.Elements("Repairer").FirstOrDefault()
              select new Job
                   {
                      Username = (string)job.Element("Username"),
                      Password = (string)job.Element("Password"),
                      RepairerName = (string)Repairer.Element("RepairerName"),
                      RepairerAddress = (string)Repairer.Element("RepairerAddress"),
                      RepairerTelephone = (string)Repairer.Element("RepairerTelephone")
                   };

另外,请注意(string)job.Element("Username") 将为您提供节点值。无需调用Value 属性。

更新:

您可以在使用 LINQ-to-XML 时使用XDocument:-

XDocument xmlDoc = XDocument.Load(XMLpath);

【讨论】:

  • 谢谢拉胡尔;您能否告诉我 Root.Element("Control") 的程序集参考,因为我遇到错误 System.Xml.Linq.XElement does not contain a definition for Root ....
  • 我有类似的东西并且在 Root.Element XElement xmlDoc = XElement.Load(path); 上出现错误var results = from job in xmlDoc.Root.Elements("Control") .....
  • 感谢您解决了这个问题,但现在在执行查询时出现了 {"Object reference not set to an instance of an object."}
  • @Rubel - 您需要调试并查看 XML 是否加载到 XDocument 对象中。使用此代码,您的 XML 对我来说工作正常。要么你在某处有错字,要么 XML 没有正确加载,请确保在 XDocument Load 方法中传递完整的 xml 路径。
  • 谢谢@Rahul,你是个传奇。完美工作:)
【解决方案2】:

你可以做类似的事情 -

Reference = (string)job.Parent.Descendants("Repairer").FirstOrDefault().Element("RepairerAddress").Value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多