如何根据元素值查询XML
本文关键字:查询 XML 元素 何根 | 更新日期: 2023-09-27 18:00:51
我有一个IEnumerable<XElement>
对象,我想根据某个节点值查询它,但不断收到null element
错误。如何根据搜索到的元素的值选择两个元素的值?我正在尝试返回firstName
和lastName
,其中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();
我的查询是基于这篇文章的,但我仍然找不到返回我想要的内容的混合物。
更新
我已经尝试了下面的建议答案,但仍然没有结果或收到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
子句后挂起。
我想"Profile"毕竟不是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");
我用这些例子来处理名称空间:
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);
希望得到帮助。
你的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();
以同样的方式再次访问名字和姓氏