2012-04-03 17 views
0

LINQクエリで情報を抽出しようとしているxmlがあります。
xmlファイルの形式は、次のようになります。XMLからクラスへのコンテンツをパースするLINQクエリ

<TopNode> 
    <Sample name="Tom" id="0" batch="1"> 
    <Sequences> 
     <NextItem id="10">Stand1 &gt;</NextItem> 
     <PreviousItem id="9">Stand2 &gt;</PreviousItem> 
    </Sequences> 
    </Sample> 
    <Sample name="Hill" id="1" batch="1"> 
    <Sequences> 
     <NextItem id="1">Stand1 &gt;</NextItem> 
     <NextItem id="2">Stand3 &gt;</NextItem> 
     <PreviousItem id="3">Stand4 &gt;</PreviousItem> 
    </Sequences> 
    </Sample> 
. 
. 
. 
</TopNode> 

私は、クエリからNextItemPreviousItem両方の属性のリストを取得する必要があります。このために、結果を得るためのクラスを定義しました。

public class Extract 
{ 
public string name 
{ 
get; 
set; 
} 
public int _id 
{ 
get; 
set; 
} 
} 

LINQクエリ(foreachのサンプルノード、クラスオブジェクトでPreviousItemとNextItemコンテンツを取得):

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem") 
       select ???... 

問題は、私はここに上記のクエリでクラスオブジェクトにデータを渡す行う方法です各サンプルノードについて
。 第二に、上記の私だけNextItemノードを取得します。 NextItemとPreviousItemの両方のクエリを書くにはどうしたらいいですか?全体的に

EDIT 、私はSequenceノードのそれぞれについて、それぞれのIEnumerableを取得した後、チエニルクエリからの全体的なIEnumerableをを返すことがあります。

EDIT2 ここにkeyを割り当てると、このエラーが発生します。

var mapping = XDocument.Load("file.xml") 
          .Descendants("Sequences") 
          .Select(n => n.Descendants("PreviousItem") 
           .Union(n.Descendants("NextItem")) 
           .Select(n1 => new Extract { _id = (int)n1.Attribute("id"), Name = n1.Value }) 
          ).ToDictionary<IEnumberable<Menu>, int>(key => key._id);//and further converting this dictionary to sorted dictionary (sorted accordign to keys) 

答えて

1
var xDoc = XDocument.Load(....); 
var result = xDoc.Descendants("NextItem") 
    .Union(xDoc.Descendants("PreviousItem")) 
    .Select(n => new {ID = n.Attribute("id").Value, Name =n.Name, Value =n.Value }); 

--EDIT- -

var result = XDocument.Load(....) 
      .Descendants("Sequences") 
      .Select(n=> n.Descendants("NextItem") 
       .Union(n.Descendants("PreviousItem")) 
       .Select(n2 => new { ID = n2.Attribute("id").Value, Name = n2.Name, Value = n2.Value }) 
      ); 
+0

これは私にIEnumerableを与えるでしょう。 NextItem、およびPreviousItemをxmlに追加します。私が実際に望むのは、Sequenceノードのそれぞれに対して、列挙型を生成して、上記の全体のIEnumberableを返す必要があるということです。私は問題を伝えたいと思います。 ; -/ – Cipher

+0

@Cipher答えを更新しました。私はあなたを正しく理解してくれることを願っています。 –

+0

ありがとう!はい。しかし、私がExtarctクラスを書いたのは、結果を辞書に変換したいということでした。つまり、 '.ToDictionary 'です。ここで 'TValue'はExtractクラスのIEnumberableです。上記のステートメントでは、 '.Select(新しいMenu {SeekPoint =(int)n1.Attribute(" time ")、ItemText = n1.Value})を実行できません。 – Cipher

1

以下のクエリは、私は質問を理解してわからないんだけど、あなたは簡単にXML selectステートメントにLINQの内側要素/属性値を取ることができます:

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem") 
       select new Extract() { name = item.Value, _id = (int)item.Attribute("id") } 
+0

私は 'NextItem'要素だけを取得していますが、' PreviousItem'ノードについても同じことをします。 ; -/ 問題は、xmlの 'Sequence'ノードごとに' PreviousItem'と 'NextItem'の別々のIEnumerableを取得し、IEnumberable全体を返したいということです。 – Cipher

0

こんにちはpect。

List<XElement> lstXElements = new List<XElement>(); 
     lstXElements.AddRange(GetDescendants("NextItem")); 
     lstXElements.AddRange(GetDescendants("PreviousItem")); 

     List<Extract> lstExtract = new List<Extract>(); 

     foreach (XElement objElement in lstXElements) 
     { 
      Extract objExtract = new Extract(); 
      objExtract._id = Convert.ToInt32(objElement.Attribute("id").Value); 
      objExtract.name = (objElement.Name).LocalName; 
      lstExtract.Add(objExtract); 
     } 
List<XElement> GetDescendants(string strDescentName) 
    { 
     return ((XDocument.Load(Server.MapPath("XMLFile1.xml")) 
      .Descendants(strDescentName)) 
      ).ToList<XElement>(); 
    } 
関連する問題