如何根据元素值

时间:2015-07-03 00:38:54

标签: c# xml linq linq-to-xml

我有一个IEnumerable<XElement>对象,我想根据某个节点值进行查询,但不断出现null element错误。如何根据搜索元素的值选择两个元素的值?我正在尝试将firstNamelastName返回ID == somevalue

以下是我的XML结构:

<Profile>
    <ID>123</ID>
    <firstName>Not</firstName>
    <lastName>Registered</lastName>
</Profile>

我的查询片段:

XDocument xdoc = XDocument.Load(someXml);
IEnumerable<XElement> nodes = xdoc.Root.Elements();
XNamespace ns = "xmlNamespace";

var name = nodes.Elements(ns + "firstName")
     .Where(x => (int)x.Element(ns + "ID") == 123)
     .SingleOrDefault();

我的观点基于this文章,但我仍然无法找到能够返回我想要的内容。

更新

我已尝试过以下建议的答案,但仍然看不到任何结果或收到Object reference not set to an instance of an object例外。

我仍然在解决这个问题,现在正在尝试这个:

var result = xdoc
    .Descendants(ns + "Profile")
    .Where(x => (int)x.Element(ns + "ID") == 1)
    .Select(x => new { FirstName = (string)x.Element(ns + "firstName"), LastName = (string)x.Element(ns + "lastName") })
    .FirstOrDefault();

当单步执行此操作时,查询会在运行Where子句后挂起。

3 个答案:

答案 0 :(得分:1)

我想&#34;简介&#34;毕竟,它不是XML的根。

所以如果我正确地读你的思想,你会有这样的事情:

XML:

<root>
<Profile>
    <ID>123</ID>
    <firstName>Not</firstName>
    <lastName>Registered</lastName>
</Profile>
<Profile>
    <ID>124</ID>
    <firstName>A</firstName>
    <lastName>B</lastName>
</Profile>
</root>

获取配置文件部分的代码,其中id元素等于123:

var result = XDocument.Parse(yourXml)
        .Root
        .Elements()
        .SingleOrDefault(i => i.Element("ID").Value == "123");

答案 1 :(得分:0)

我做这个例子来处理命名空间:

的profiles.xml:

<Profiles xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
    <Profile>
        <ID>122</ID>
        <firstName>Not</firstName>
        <lastName>Registered</lastName>
    </Profile>
    <Profile>   
        <ID>123</ID>
        <firstName>Not</firstName>
        <lastName>Registered</lastName>
    </Profile>
</Profiles>

代码:

XElement xDoc = XElement.Load(@"C:\Profiles.xml");
XNamespace ns = "http://schemas.microsoft.com/2004/06/E2ETraceEvent";

var profile = xDoc.Elements(ns + "Profile")
            .SingleOrDefault(x => x.Element(ns + "ID").Value == "123");
Console.WriteLine("firstName: " + profile.Element(ns + "firstName").Value);
Console.WriteLine("lastName: " + profile.Element(ns + "lastName").Value);

希望得到这个帮助。

答案 2 :(得分:0)

你的xml喜欢这个

<?xml version="1.0" encoding="utf-8" ?>
<Employee>
  <Profile>
    <ID>123</ID>
    <firstName>Kumod</firstName>
    <lastName>Singh</lastName>
  </Profile>
  <Profile>
    <ID>124</ID>
    <firstName>Ravi</firstName>
    <lastName>Ranjam</lastName>
  </Profile>
</Employee>

我们可以访问第一个姓名和姓氏

 string strPath1 = Server.MapPath("~/XmlData/abc.xml");
        var ResultOfFirLasName = (from studentProfile in XDocument.Load(strPath1).Descendants("Profile")
                                  where (int)studentProfile.Element("ID") == 123
                                  select new { FirstName = (string)studentProfile.Element("firstName"), LastName = (string)studentProfile.Element("lastName") }).FirstOrDefault();
        string strFirstName = ResultOfFirLasName.FirstName;
        string LastName = ResultOfFirLasName.LastName;

你也可以使用lemda表达式

var ResultOfFirLasName1 = XDocument.Load(strPath1).Descendants("Profile").Where(x => (int)x.Element("ID") == 123).Select(x=> new {FirstName =(string)x.Element("firstName"),LastName =(string)x.Element("lastName")}).FirstOrDefault();

您再次访问第一个姓名和姓氏