按属性值访问xml元素

Red*_*wan 8 c# xml parsing

可能这个问题重复了,但我并不满足于现有的答案.我想通过属性值从动态生成的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>
Run Code Online (Sandbox Code Playgroud)

我想通过仅传递Guid值来找到元素.没有它的xpath,它的节点位置/位置.我怎么能在C#中做到这一点?我需要使用LINQ吗?

编辑:

 XDocument xmldoc = XDocument.Load(xmlFilePath);
XElement selectedElement = xmldoc.Descendants().Where(x => (string) x.Attribute("id") == myIdvalue).FirstOrDefault(); 
Run Code Online (Sandbox Code Playgroud)

例外: "表达式不能包含lambda表达式"我添加了使用System.Linq namspaces.

Jon*_*eet 9

hoipolloi给出了XPath答案,这很好 - 但我个人会使用LINQ to XML.(有关原因,请参阅我关于代码和数据的博文.)

var element = parent.Descendants()
                    .Where(x => (Guid?) x.Attribute("id") == id)
                    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

这将对每个id属性执行适当的GUID解析(Guid?为非GUID 返回"null" 值).如果您确定ID的文本格式,则可以转换为字符串:

var element = parent.Descendants()
                    .Where(x => (string) x.Attribute("id") == idText)
                    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

更改FirstOrDefaultSingle,SingleOrDefaultFirst根据您的要求.

编辑:你发布的代码到底出了什么问题一点也不清楚.这是一个简短但完整的程序,显示它工作正常.请将其与您的代码进行比较:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


hoi*_*loi 5

您可以使用 XPath 来执行此操作。例如,以下内容匹配 id 为“foo”的所有元素,无论它们在文档中的位置如何:

//*[@id='foo']
Run Code Online (Sandbox Code Playgroud)