Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按属性值访问xml元素_C#_Xml_Parsing - Fatal编程技术网

C# 按属性值访问xml元素

C# 按属性值访问xml元素,c#,xml,parsing,C#,Xml,Parsing,也许这个问题重复了一遍,但我对现有的答案并不满意。我想通过属性值从动态生成的xml文件中获取xml元素。我们不知道有多少节点,以及它的结构。但每个元素、其子元素、其子元素、子元素……等都将包含唯一的guid作为“Id”属性: <Element id=""> <SubElement id=""></SubElement> <SubElement id=""> <SubSubElement id="">

也许这个问题重复了一遍,但我对现有的答案并不满意。我想通过属性值从动态生成的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>
例外情况: “表达式不能包含lambda表达式”
我已经添加了使用System.Linq.namspaces

您可以使用XPath来实现这一点。例如,以下内容匹配id为“foo”的所有元素,而不考虑它们在文档中的位置:

//*[@id='foo']

hoipolloi给出了一个XPath答案,这很好——但我个人会使用LINQ转换XML。(见附件。)

这将对每个
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);
    }
}
使用系统;
使用System.Linq;
使用System.Xml.Linq;
课堂测试
{
静态void Main()
{
字符串xml=”“;
XDocument doc=XDocument.Parse(xml);
字符串idToFind=“bar”;
XElement selectedElement=doc.subjects()
.Where(x=>(string)x.Attribute(“id”)==idToFind.FirstOrDefault();
Console.WriteLine(selectedElement);
}
}

使用LINQ的优点是什么?从.NET1.2开始,我就没有在C#中开发过。仅供参考,我刚买了你的书,以使自己跟上4.:)@hoipolloi:我发现它有助于使数据部分远离代码部分-编译器可以在编译时检测语法错误,你知道方法(
子体
等)将真正存在-所有这些都推迟到执行时,才是真正的数据相关方面。LINQ to XML还使名称空间处理变得轻而易举:)@Jon Skeet:我已经尝试过这些表达式,但我得到了“表达式不能包含lambda表达式”。如果我是对的,那么“Parent”必须是加载了xml文档的XDocument对象。为什么我会得到这个异常?@红天鹅:请拿出一个简短但完整的程序来演示这个问题。应该没问题。@Red Swan:您的代码试图强制转换为
字符串?
,这是一个无效的类型-您只能将
用作不可为空的值类型的后缀。它工作得很好。但有没有办法通过LINQ或任何实体框架对象medel实现这一点?
var element = parent.Descendants()
                    .Where(x => (string) x.Attribute("id") == idText)
                    .FirstOrDefault();
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);
    }
}