可能这个问题重复了,但我并不满足于现有的答案。我想通过属性值从动态生成的xml文件中获取xml元素。我们不知道有多少节点,它的层次结构。但是每个元素,它的子元素,它的子子元素,子子元素......等等都将包含唯一的guid作为“Id”属性:
<Element id="">
<SubElement id=""></SubElement>
<SubElement id="">
<SubSubElement id="">
<SubSubSubElement id="">
<SubSubSubSubElement id="">....other sub inside this ...</SubSubSubSubElement>
</SubSubSubElement>
</SubSubElement>
</SubElement>
</Element>
我想通过仅传递Guid值来找到元素。没有它的xpath,它的节点位置/位置。我怎么能在C#中做到这一点?我需要使用LINQ吗?
编辑:
XDocument xmldoc = XDocument.Load(xmlFilePath);
XElement selectedElement = xmldoc.Descendants().Where(x => (string) x.Attribute("id") == myIdvalue).FirstOrDefault();
例外: “表达式不能包含lambda表达式” 我添加了Using System.Linq namspaces。
答案 0 :(得分:8)
hoipolloi给出了一个XPath答案,这很好 - 但我个人会使用LINQ to XML。 (见my blog post on code and data for reasons。)
var element = parent.Descendants()
.Where(x => (Guid?) x.Attribute("id") == id)
.FirstOrDefault();
这将对每个id
属性执行适当的GUID解析(为非GUID返回“null”Guid?
值)。如果您确定ID的文本格式,则可以转换为字符串:
var element = parent.Descendants()
.Where(x => (string) x.Attribute("id") == idText)
.FirstOrDefault();
根据您的要求,将FirstOrDefault
更改为Single
,SingleOrDefault
或First
。
编辑:你发布的代码到底出了什么问题一点也不清楚。这是一个简短但完整的程序,显示它工作正常。请将其与您的代码进行比较:
using System;
using System.Linq;
using System.Xml.Linq;
class Test
{
static void Main()
{
string xml = "<parent><foo id='bar' /><foo id='baz' /></parent>";
XDocument doc = XDocument.Parse(xml);
string idToFind = "bar";
XElement selectedElement = doc.Descendants()
.Where(x => (string) x.Attribute("id") == idToFind).FirstOrDefault();
Console.WriteLine(selectedElement);
}
}
答案 1 :(得分:4)
您可以使用XPath执行此操作。例如,以下匹配所有id为'foo'的元素,无论它们在文档中的位置如何:
//*[@id='foo']