首页 > 解决方案 > 使用 xdocument 按不区分大小写的属性搜索元素

问题描述

我有这段代码用于解析一些运行良好的 xml:

string text = File.ReadAllText("myfile.xml");

XDocument doc = XDocument.Parse(text); //or XDocument.Load(path)

// LINQ to XML query  
XElement alternateSpkgRootElement =
    (from el in doc.Descendants()
    where (string)el.Attribute("name") == "myname" || (string)el.Attribute("Name") == "myname"
    select el).FirstOrDefault();

问题是我的 XML 可以在开头有带有大写字母的属性,例如,而el.Attribute("name")不是el.Attribute("Name").

有没有一种很好的方法来搜索这些而不做:

where (string)el.Attribute("name") == "myname" || (string)el.Attribute("Name") == "myname"

编辑

下面是一些示例 XML,说明为什么以前建议的问题不能回答我的问题:

<testenv version="1" edition="1" testArchitecture="amd64" xmlns:x="1">
  <x:Copy File="../s34tenv" Ref="22" x:Id="W34CG">
    <x:Set Select="//testlistSearchPath" Name="path" Value="\\s3464\TestMD" />
    <x:Append>
      <chunkRequirement name="BV34n" flavor="amd64fre" />
      <chunkRequirement name="TES34INS" flavor="amd64fre" />
      <param name="InvestigationMappingsFilePath" value="\\red34CG.xml" />
      <param name="Rerun\Enabled" value="True" />
      <param name="_AlternateSpkgRoot" value="\\34MD\AEAuto" />
      <param name="_DeleteETWLogs" value="0" />
      <param name="MinLoadBalanceFactor" value="6" />
      <param name="MaxLoadBalanceFactor" value="12" />
      <param name="Rerun\Attempts" value="1" />
    </x:Append>
  </x:Copy>
  <x:Copy File="../34es.xml" Ref="DES34iles" />
</testenv>

标签: c#xmllinq-to-xml

解决方案


您可以添加一个扩展方法:

public static class XElementExtensions
{
    public static XAttribute AttributeIgnoreCase(this XElement element, string localName)
    {
        return element.Attributes()
            .FirstOrDefault(x => 
                string.Equals(x.Name.LocalName, localName, StringComparison.OrdinalIgnoreCase));
    }
}

并像这样使用:

where (string)el.AttributeIgnoreCase("name") == "myname"

推荐阅读