编程语言
首页 > 编程语言> > C#Linq for XML:tag.descendants不允许审问所有后代

C#Linq for XML:tag.descendants不允许审问所有后代

作者:互联网

我在这个网站上还很新,这是我的第一个问题.我阅读了文档,但是如果您违反任何行为准则,对不起.
这是我的问题:

我在流中有一个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()
           };

标签:linq-to-xml,linq,xml,c,net
来源: https://codeday.me/bug/20191026/1935406.html