2017-01-30 11 views
3

私はこのウェブサイト上でかなり新しいよに質問することはできません、それは私の最初の質問です。私はその文書を読んだが、行動規範を制圧すれば、事前に申し訳なく思う。私は、ストリーム内のXMLファイルを持っているC#のLINQ:tag.descendantsは、すべての子孫

: はここに私の質問です。私の目標は、属性「名前」、「タイプ」、およびキー(明らかな理由で変更されている)を取得することです。

<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; } 
    } 

を保持するクラスを作成し、私は私のオブジェクトに(後を参照)var listのすべての要素を追加するMsProductのリストを作成しました。

Key = (List<string>)keysなしでコンパイルするLinqクエリを作成しましたが、値Name, Typeは空です(データが存在しない場合(つまり== null)、それが " )。

私はKey = (List<string>)keysを追加すると、システムは「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 
        }; 

誰もが私のクラスを移入するために、私のファイルを照会する方法任意のアイデアを持っていますか?

ありがとうございます!

+1

タイプはキーではなく、製品の属性です。その行とコメントをコメントしてください。もう1つ、あなたのXMLは有効ではありません。 – A3006

+0

すぐにお返事ありがとうございます。 XMLはMicrosoftから直接提供され、それは自分のMSDNサブスクリプティングのエクスポートです。私はコードを作成しませんでした;)。キーはちょうど声を掛けた答えによって答えられました、私は今どのように "タイプ"を完成させるのだろうかと思っています。 –

答えて

2

あなたのキーは文字列ではなく、XElements、あなたはstringにキャストできませんでした。あなたが取得したいん内容に応じて、あなたができる:あなたがいない製品が、YourKey年代を照会するので、

Key = (List<string>)keys.Select(x=>x.Value).ToList() 

または

Key = (List<string>)keys.Select(x=>x.ToString()).ToList() 

をしかし、あなたはあなたのXMLに何を取得し、取得します製品は最初の行を次のように変更します。

var list = from product in productName.Descendants("Product_Key") 

タイプを取得する場合は、複数のタイププロ製品があることを考慮する必要があります。あなたは、キーとしてリストにタイプを照会、またはあなたは彼らがすべて同じであることを確認しているので、あなただけの最初のものを取ることができる次のいずれか

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() 
      }; 
+0

すぐにお返事ありがとうございます。これにより、キーのリストで問題が解決しましたが、私の 'type'はまだ空です。 let type = productName.Descendants(" Key ")アトリビュート(" Type ") タイプ=(ストリング)type.Select(X => x.Value).ToString()、 しかし、今、type'が 'の値が " タイプ\t" System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [System.Xmlのです。 Linq.XAttribute、System.String] "\t string " –

+0

タイプとして何を見たいですか? 「スタティックアクティベーションキー」など –

+0

はい、私は静的なアクティベーションキー、小売またはMultipleActivationをファイルに持っています。私はこの情報が自分のソフトウェアに必要です。 –

2

あなたはそれらのlet文は必要ありません。キーから値を取得する必要があります。

var list = from product in productName.Descendants("Product_Key") 
       where product.Attribute("Name").Value == "YourKey" 
      // let name = product.Attribute("Name") 
      // let type = product.Attribute("Type") 
      // let keys = product.Elements("Key") 
       select new MsProduct 
       { 
        Name = (string)product.Attribute("Name"), 
        Type = product.Elements("Type").First().Attribute("Type").Value, 
        Key = product.Elements("Key").Select(e=>e.Value).ToList() 
       }; 

しかし、Elements("Type").First()はもちろん疑問のある定義です。
ProductKeyの種類はありません。それは多くのタイプを持つことができます。

+0

私の「タイプ」の問題で実際に問題が解決されます。どうもありがとうございました!!!!どうしてそれが疑わしい定義なのか尋ねてもらえますか? –

+0

XMLは1つのProduct_Keyに対して異なるタイプを明確に許可するためです。だから、_the_ Typeはここではカダニティを間違っていると言っています。 –

関連する問題