c# - 使用 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>
解决方案
您可以添加一个扩展方法:
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"
推荐阅读
- amazon-athena - Athena:在 information_schema 上创建视图
- c# - 在 linq 查询中按字母顺序列出我的数据时遇到问题
- excel - 如何使用变量引用单元格?看似“正确”的对象范围返回错误 1004 VBA
- c# - 如何使用动态类型的 IQueryable?
- android - 无法在所选地点获得 latlong
- flutter - 如何在颤动中将应用程序从后台带到前台
- python - 如何以正确的格式发送请求的数据?
- angular - Angular:如何在 chartjs 中显示具有动态值的图形(arry)
- typescript - 如何在打字稿中动态调用实例方法?
- angular - 嵌套可观察订阅问题,无法取消订阅