2011-12-20 13 views
0

C#.netを使用してXMLファイルを読み込み、LINQの助けを借りてINSTANCEとCINSTANCEの値に基づいてノードをXMLにグループ化したいと考えています。どうやってやるの? これは私のソース・スキーマです:C#.netでLINQを使用してXMLデータをグループ化する方法は?

<XYZ> 
    <TYPE>A</TYPE> 
    <INSTANCE>1357599</INSTANCE> 
    <CHILD>DESCRIPTION</CHILD> 
    <CINSTANCE>PQR</CINSTANCE> 
    <CPOS>0000</CPOS> 
    </XYZ> 

    <XYZ> 
    <TYPE>GP</TYPE> 
    <INSTANCE>1472422</INSTANCE> 
    <CHILD>A</CHILD> 
    <CINSTANCE>1357599</CINSTANCE> 
    <CPOS>0010</CPOS> 
    </XYZ> 

    <XYZ> 
    <TYPE>GP</TYPE> 
    <INSTANCE>1472427</INSTANCE> 
    <CHILD>A</CHILD> 
    <CINSTANCE>1357599</CINSTANCE> 
    <CPOS>0010</CPOS> 
    </XYZ> 

    <XYZ> 
    <TYPE>A</TYPE> 
    <INSTANCE>1357600</INSTANCE> 
    <CHILD>DESCRIPTION</CHILD> 
    <CINSTANCE>PQR</CINSTANCE> 
    <CPOS>0000</CPOS> 
    </XYZ> 

    <XYZ> 
    <TYPE>GP</TYPE> 
    <INSTANCE>1472425</INSTANCE> 
    <CHILD>A</CHILD> 
    <CINSTANCE>1357600</CINSTANCE> 
    <CPOS>0010</CPOS> 
    </XYZ> 

    <XYZ> 
    <TYPE>GP</TYPE> 
    <INSTANCE>1472426</INSTANCE> 
    <CHILD>A</CHILD> 
    <CINSTANCE>1357600</CINSTANCE> 
    <CPOS>0010</CPOS> 
    </XYZ> 

これは私の出力のようになります。

<Group> 
    <XYZ> 
<TYPE>A</TYPE> 
<INSTANCE>1357599</INSTANCE> 
<CHILD>DESCRIPTION</CHILD> 
<CINSTANCE>PQR</CINSTANCE> 
<CPOS>0000</CPOS> 
</XYZ> 

    <XYZ> 
<TYPE>GP</TYPE> 
<INSTANCE>1472422</INSTANCE> 
<CHILD>A</CHILD> 
<CINSTANCE>1357599</CINSTANCE> 
<CPOS>0010</CPOS> 
</XYZ> 

    <XYZ> 
<TYPE>GP</TYPE> 
<INSTANCE>1472427</INSTANCE> 
<CHILD>A</CHILD> 
<CINSTANCE>1357599</CINSTANCE> 
<CPOS>0010</CPOS> 
</XYZ> 
    </Group>  

    <Group> 
    <XYZ> 
<TYPE>A</TYPE> 
<INSTANCE>1357600</INSTANCE> 
<CHILD>DESCRIPTION</CHILD> 
<CINSTANCE>PQR</CINSTANCE> 
<CPOS>0000</CPOS> 
</XYZ> 

    <XYZ> 
<TYPE>GP</TYPE> 
<INSTANCE>1472425</INSTANCE> 
<CHILD>A</CHILD> 
<CINSTANCE>1357600</CINSTANCE> 
<CPOS>0010</CPOS> 
</XYZ> 

    <XYZ> 
<TYPE>GP</TYPE> 
<INSTANCE>1472426</INSTANCE> 
<CHILD>A</CHILD> 
<CINSTANCE>1357600</CINSTANCE> 
<CPOS>0010</CPOS> 
</XYZ> 
    </Group> 

私はこのためのロジックを記述するためにとにかくINSTANCE==CINSTANCE ..Isに基づいてグループXYZノードに必要ですか?

+0

http://www.linqpad.net/ Linqpadには、「サンプル」タブのlinqからxmlへのサンプル/チュートリアルの完全なセットがあります。 – asawyer

答えて

1

おそらくあなたは以下のコードのようなものを探していますが、フォーマットに軽微な変更が必要な場合は、Xmlに有効な親要素が必要です。

static void Main(string[] args) 
    { 
     string xml = @"<ELEMENTS><XYZ>  <TYPE>A</TYPE>  <INSTANCE>1357599</INSTANCE>  <CHILD>DESCRIPTION</CHILD>  <CINSTANCE>PQR</CINSTANCE>  <CPOS>0000</CPOS>  </XYZ>  <XYZ>  <TYPE>GP</TYPE>  <INSTANCE>1472422</INSTANCE>  <CHILD>A</CHILD>  <CINSTANCE>1357599</CINSTANCE>  <CPOS>0010</CPOS>  </XYZ>  <XYZ>  <TYPE>GP</TYPE>  <INSTANCE>1472427</INSTANCE>  <CHILD>A</CHILD>  <CINSTANCE>1357599</CINSTANCE>  <CPOS>0010</CPOS>  </XYZ>  <XYZ>  <TYPE>A</TYPE>  <INSTANCE>1357600</INSTANCE>  <CHILD>DESCRIPTION</CHILD>  <CINSTANCE>PQR</CINSTANCE>  <CPOS>0000</CPOS>  </XYZ>  <XYZ>  <TYPE>GP</TYPE>  <INSTANCE>1472425</INSTANCE>  <CHILD>A</CHILD>  <CINSTANCE>1357600</CINSTANCE>  <CPOS>0010</CPOS>  </XYZ>  <XYZ>  <TYPE>GP</TYPE>  <INSTANCE>1472426</INSTANCE>  <CHILD>A</CHILD>  <CINSTANCE>1357600</CINSTANCE>  <CPOS>0010</CPOS>  </XYZ></ELEMENTS>"; 
     Console.WriteLine(GetGroups(xml).ToString()); 
    } 

    private static XDocument GetGroups(string xml) 
    { 
     XDocument xyzElementsDocument = XDocument.Parse(xml); 

     var results = from xyzElement1 in xyzElementsDocument.Descendants("XYZ") 
         join xyzElement2 in xyzElementsDocument.Descendants("XYZ") 
         on (string)xyzElement1.Element("INSTANCE") equals (string)xyzElement2.Element("CINSTANCE") into joinedElements 
         from joinedElement in joinedElements.DefaultIfEmpty() 
         group xyzElement1 by joinedElement != null into groupedElements 
         select new { HasCInstance = groupedElements.Key, Elements = groupedElements.Distinct() }; 

     XDocument groupDocument = new XDocument(); 
     groupDocument.Add(new XElement("GROUPS")); 
     foreach (var result in results) 
     { 
      XElement groupElement = new XElement("GROUP"); 
      groupElement.Add(result.Elements); 
      groupDocument.Root.Add(groupElement); 
     } 

     return groupDocument; 
    } 
+0

@ user1061293これはあなたのために働いたのですか?あなたは本当にあなたの質問の答えをコメントするか受け入れる必要があり、結局人々はあなたに答えることを嫌います。 – JamieSee