从xml元素中选择多个属性值,该元素具有与特定情况c#LINQ匹配的属性
本文关键字:属性 元素 情况 c#LINQ 选择 xml | 更新日期: 2023-09-27 18:21:12
我有一个看起来像的XML
<?xml version="1.0"?>
<configuration>
<TemplateMapper>
<Template XML="Product.xml" XSLT="sheet.xslt" Keyword="Product" />
<Template XML="Cart.xml" XSLT="Cartsheet.xslt" Keyword="Cart" />
</TemplateMapper>
</configuration>
当我将属性Keyword的值作为"product"传入时,我希望LINQ将XML和XSLT属性的值作为字符串和字符串的Dictionary返回给我。
到目前为止,我已经尝试过:
var Template="Product"
var dictionary = (from el in xmlElement.Descendants("TemplateMapper")
let xElement = el.Element("Template")
where xElement != null && xElement.Attribute("Keyword").Value == Template
select new
{
XML = el.Attribute("XML").Value,
XSLT= el.Attribute("XSLT").Value
}).ToDictionary(pair => pair.XML, pair => pair.XSLT);
KeyValuePair<string, string> templateValues = dictionary.FirstOrDefault();
它给出了一个错误"对象引用未设置为对象实例"。有人能认出我做错了什么吗?帮助真的很感激。
我会尝试以下操作:
var dictionary = (from t in xdoc.Root.Element("TemplateMapper").Elements("Template")
where (string)t.Attribute("Keyword") == Template
select new {
XML = (string)t.Attribute("XML"),
XSLT = (string)t.Attribute("XSLT")
}).ToDictionary(x => x.XML, x => x.XSLT);
当找不到属性时,(string)XAttribute
不会抛出异常,所以最好是XAttribute.Value
。
用这个替换您的代码
var Template="Product"
var dictionary = (from el in xmlElement.Descendants("TemplateMapper")
let xElement = el.Element("Template")
where xElement != null && xElement.Attribute("Keyword").Value == Template
select new
{
XML = xElement .Attribute("XML").Value,
XSLT= xElement .Attribute("XSLT").Value
}).ToDictionary(pair => pair.XML, pair => pair.XSLT);
KeyValuePair<string, string> templateValues = dictionary.FirstOrDefault();
您当前所在的元素是xElement而不是el