我在这个网站上还很新,这是我的第一个问题.我阅读了文档,但是如果您违反任何行为准则,对不起.
这是我的问题:
我在流中有一个XML文件.我的目标是获取属性“名称”,“类型”和一个或多个键(出于明显的原因,它们已被更改).
<YourKey>
<Product_Key Name="eMbedded Visual C++ 4.0">
<Key ID="5" Type="Static Activation Key" ClaimedDate="">BBBBB-QW36D-DPT6T-BBBB-ZZZZZ</Key>
</Product_Key>
<Product_Key Name="Windows 10 Home">
<Key ID="1251" Type="Retail" ClaimedDate="1/25/2017">ZZZZZ-6GBG7-ZZZZZ-8JG23-FM47H</Key>
<Key ID="1251" Type="Retail" ClaimedDate="8/23/2016">FEFEF-FVD7K-EEEEF-BEBEB-VMHX7</Key>
<Key ID="1251" Type="Retail" ClaimedDate="4/28/2016">EEZZE-GYB6P-ZZZEE-R72PQ-EEEEZ</Key>
</Product_Key>
</YourKey>
我创建了一个类来保存数据
public class MsProduct
{
public string Name { get; set; }
public string Type { get; set; }
public List<string> key { get; set; }
}
然后,我创建了一个MsProduct列表,以将var list(请参见下文)的每个元素添加到我的对象中.
我创建了一个Linq查询,它在编译时没有Key =(List< string>)键,但是我只得到值Name,Type为空(我检查数据是否不存在(即== null),将其替换为“”).
当我添加Key =(List< string>)键时,系统会引发“ system.invalidCastException”.
这是我的查询:
var productName = XDocument.Load(fileXml);
var list = from product in productName.Descendants("YourKey")
let name = product.Attribute("Name")
let type = product.Attribute("Type")
let keys = product.Elements("Key")
select new MsProduct
{
Name = (string)name,
Type = (string)type,
Key = (List<string>)keys
};
提前致谢!
解决方法:
您的键不是字符串,而是XElements,您无法将其转换为字符串.根据您想要获得什么,您可以执行以下操作:
Key = (List<string>)keys.Select(x=>x.Value).ToList()
要么
Key = (List<string>)keys.Select(x=>x.ToString()).ToList()
但是您在xml上什么都不会得到,因为您查询的不是产品,而是查询的YourKey,获取产品的第一行更改为:
var list = from product in productName.Descendants("Product_Key")
如果要获取类型,则应考虑拥有多个Type pro产品.您可以将列表中的类型作为键查询,或者可以确保它们都相同,因此可以只选择第一个:
var list = from product in productName.Descendants("Product_Key")
let name = product.Attribute("Name")
let keys = product.Elements("Key")
select new MsProduct
{
Name = (string)name,
Type = keys.First().Attribute("Type").Value,
Key = (List<string>)keys.Select(x=>x.Value).ToList()
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。