C#使用linq查找匹配两个元素级别的xml元素

but夫

我试图从xml文档中选择一个XElement并在xml文档的两个“级别”上进行匹配。我的文件结构是:

<app>
  <Library Name="Main" Path="C:\somefile.Xml">
    <ReadingList Name="Test1">
      <Book>...
    <ReadingList Name="Test2">
      <Book>...
  <Library Name="Backup" Path="C:\somefile.Xml">

而且我想在“ Main”库中找到阅读列表名称“ test2”,以便可以将此元素和所有子元素复制到另一个“ Library”节点。

在尝试学习此方法时,我希望使用linq解决方案。

预先感谢您的任何帮助

当我添加一个新的“阅读列表”时,我会这样做:

public void AddReadingList(string fullyQualifiedPath, Library lib, string name)
{
    XDocument xdoc = XDocument.Load(fullyQualifiedPath);

    XElement library = xdoc.Element("eStack").Elements("Library")
                .Single(x => x.Attribute("Name").Value == lib.Name);

    library.Add(new XElement("ReadingList", new XAttribute("Name", name)));

    xdoc.Save(fullyQualifiedPath);                        
}

但是我要执行的操作是此元素和子元素的副本。问题是,可能有多个具有相同名称的“库”元素,因此我需要检查库名称和阅读列表名称。那有意义吗?

吉拉德·格林(Gilad Green)

使用.DescendantsWhere组合将达到目的:

var result = XDocument.Load(fullyQualifiedPath)
     .Descendants("Library")
         //Can replace with `FirstOrDefault` if you know there is only one
     .Where(element => element.Attribute("Name")?.Value == "Main") 
     .Descendants("ReadingList")
     .Where(element => element.Attribute("Name")?.Value == "Test2").ToList();

您也可以.Elements代替Descendants我只是喜欢使用它,这样一来就不会同时指定app或任何其他级别


对于以前的c#6.0,您可以执行以下操作:

var result = XDocument.Load("data.xml")
     .Descendants("Library")
     .Where(element =>
     {
        var att = element.Attribute("Name");
        return att != null ? (att.Value == "Main" ? true : false) : false;
     })
     .Descendants("ReadingList")
         //Make sure to do above change here too
     .Where(element => element.Attribute("Name")?.Value == "Test2").ToList();

或者,如果创建一种方法来帮助解决问题,而不是重复执行代码:

 Func<XElement, string, string> tryGetAttributeValue = (element, attributeName) =>
 {
    var attribute = element.Attribute(attributeName);
    return attribute == null ? string.Empty : attribute.Value;
 };

 var result = XDocument.Load("data.xml")
     .Descendants("Library")
     .Where(element => tryGetAttributeValue(element,"Name") == "Main")
     .Descendants("ReadingList")
     .Where(element => tryGetAttributeValue(element, "Name") == "Test2").ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查找两个列表中匹配元素之间的元素

查找两个列表的匹配元素的索引

匹配两个numpy数组以查找相同的元素

遍历两个列表并使用pandas python查找匹配的元素

查找共享同一级别的两个级别的值的比例

在 Python Selenium 中使用两个标准查找元素

使用SIMD查找两个元素的最大区别

使用html和CSS匹配两个元素的中心

使用Javascript匹配两个HTML元素的高度

根据两个值查找元素

如何使用linq和C#查询两个表以匹配值?

LINQ:如何比较两个元素?

使用两个不同类别的部分文本选择一个元素

C#控制台应用程序-LINQ在两个IEnumerable之间查找匹配值

使用domdocument在两个XML元素内编写

C#:使用Linq和Lambda获取2个集合之间的不匹配元素

如何找到与 CssSelectors 匹配的两个元素的父元素?

两个级别的HABTM关联

在 C# 中使用逗号连接两个 List<string> 中的元素

如何查找和删除在两个不同数组中匹配的元素?Javascript

使用RegExp匹配或查找html / xml元素

如何使用LINQ C#合并和更新两个xml文件

查找两个数组之间的匹配元素并更新它们

匹配两个文件的列元素并使用 AWK/PERL 将其替换为匹配的行

BigQuery:两个匹配级别的自定义维度

在 C# 中使用 linq 比较两个列表

如何使用Linq合并两个c#对象

如何使用 C#、Linq 和 XML 选择特定元素?

XML/XSD 问题:如何使两个名称不同的元素始终相互匹配