C#XDocument如何使用Linq过滤元素

C# XDocument how to use linq to filter elements(C#XDocument如何使用Linq过滤元素)

本文介绍了C#XDocument如何使用Linq过滤元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用

从Memory Stream读取XML
XDocument doc = XDocument.Load(targetStream);

foreach (XElement element in doc.Root.Elements())
{
     Console.WriteLine(element);
}

我的一个元素如下所示。我不确定为什么要将名称空间xmlns添加到每个元素。基本上,我想筛选SerialNo=01的所有‘Header’元素

<Header xmlns="LR/2020-21">
  <CollectionDetails>
    <Collection>ILR</Collection>
    <Year>2021</Year>
    <FilePreparationDate>2020-05-08</FilePreparationDate>
  </CollectionDetails>
  <Source>
    <ProtectiveMarking>OFFICIAL-SENSITIVE-Personal</ProtectiveMarking>
    <UKPRN>99999999</UKPRN>
    <SoftwareSupplier>SupplierName</SoftwareSupplier>
    <SoftwarePackage>SystemName</SoftwarePackage>
    <Release>1</Release>
    <SerialNo>01</SerialNo>
    <DateTime>2020-05-08T09:14:05</DateTime>
    <!-- This and the next element only appear in files generated by FIS -->
    <ReferenceData>Version5.0, LARS 2018-08-01</ReferenceData>
    <ComponentSetVersion>1</ComponentSetVersion>
  </Source>
</Header>

甚至下面的代码也带来了空记录

        IEnumerable<XElement> list1 =
                            from el in doc.Descendants("Header")
                            where (string)el.Attribute("xmlns") == "LR/2020-21"

                            select el;

有人能帮我这个忙吗?

谢谢

推荐答案

因此,如果要筛选命名空间,则需要为元素名称提供正确的命名空间。如下所示:

var ns = XNamespace.Get("LR/2020-21");

var headers = doc.Root
    .Elements(ns + "Header")
    .Where(e => (string)e.Element(ns + "Source").Element(ns + "SerialNo") == "01");

如果同一Header元素中存在多个SerialNo,则可以使用以下表达式。

var ns = XNamespace.Get("LR/2020-21")

var matchingHeaders = doc.Root
    .Elements(ns + "Header")
    .Where(header => header
        .Elements(ns + "Source")
        .Any(source => source
            .Elements(ns + "SerialNo")
            .Any(serialNo => (string)serialNo == "01")))

这篇关于C#XDocument如何使用Linq过滤元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:C#XDocument如何使用Linq过滤元素

基础教程推荐