2012-05-26 12 views
6

Ho bisogno di raggruppare il valore "Document" da XML. Il problema è perché il valore chiave (productType) può essere multiplo.Come raggruppare i dati XML in base al valore multiplo

Si tratta di XML:

<Documents> 
<Document> 
    <id>1</id> 
    <title>title1</title> 
    <productTypes> 
     <productType id="x1">Capital Costs Analysis Forum - Brazil</productType> 
    <productType id="x3">Environmental, Health and Safety &amp; Sustainability</productType> 
    </productTypes> 
</Document> 
<Document> 
    <id>2</id> 
    <title>title2</title> 
    <productTypes> 
    <productType id="x1">Capital Costs Analysis Forum - Brazil</productType> 
    </productTypes> 
</Document> 
<Document> 
    <id>3</id> 
    <title>title3</title> 
    <productTypes> 
    <productType id="x3">Environmental, Health and Safety &amp; Sustainability</productType> 
    </productTypes> 
</Document> 
<Document> 
    <id>4</id> 
    <title>title4</title> 
    <productTypes> 
     <productType id="x2">Defense, Risk &amp; Security</productType> 
    </productTypes> 
</Document> 

e questo è quello che cerco:

var documents = from document in some.Descendants("Document") 
       group document by (string)document 
        .Element("productTypes") 
        .Elements("productType") 
        .First() into docGroup 
select docGroup; 

Il mio codice funziona solo se v'è un elemento di prodotto. Come cambiare il mio codice per funzionare se c'è più valore di productType?

+0

Is documento (1) è un gruppo diverso, o dovrebbe andare nei gruppi di Documento (2) e documento (3) allo stesso tempo? Puoi mostrare il tuo output atteso? –

+1

Ci saranno tre gruppi: 1) il documento (1) e il documento (2) saranno sotto la chiave "Capital Costs Analysis Forum - Brasile" 2) il documento (1) e il documento (3) saranno sotto la chiave " Ambiente, salute e sicurezza & Sostenibilità " 3) il documento (4) sarà sotto la chiave" Difesa, Rischio & Sicurezza " Il mio problema è il caso 2. Grazie per la risposta. – drazen

risposta

2

Lei non ha spiegato quale risultato si vuole, ma ho il sospetto che si desidera che il seguente raggruppamento:

 var documentGroups = 
      from document in XDocument.Load("input.xml").Descendants("Document") 
      from productType in document.Element("productTypes").Elements("productType") 
      group document by (string)productType.Attribute("id"); 

     foreach (var documentGroup in documentGroups) 
     { 
      Console.WriteLine("Group {0} has the following members:", documentGroup.Key); 
      foreach (XElement document in documentGroup) 
      { 
       Console.WriteLine("\t{0}", (string)document.Element("title")); 
      } 
      Console.WriteLine(); 
     } 

Con essendo l'ingresso

<Documents> 
    <Document> 
    <id>1</id> 
    <title>title1</title> 
    <productTypes> 
     <productType id="x1">Capital Costs Analysis Forum - Brazil</productType> 
     <productType id="x3">Environmental, Health and Safety &amp; Sustainability</productType> 
    </productTypes> 
    </Document> 
    <Document> 
    <id>2</id> 
    <title>title2</title> 
    <productTypes> 
     <productType id="x1">Capital Costs Analysis Forum - Brazil</productType> 
    </productTypes> 
    </Document> 
    <Document> 
    <id>3</id> 
    <title>title3</title> 
    <productTypes> 
     <productType id="x3">Environmental, Health and Safety &amp; Sustainability</productType> 
    </productTypes> 
    </Document> 
    <Document> 
    <id>4</id> 
    <title>title4</title> 
    <productTypes> 
     <productType id="x2">Defense, Risk &amp; Security</productType> 
    </productTypes> 
    </Document> 
</Documents> 

che emette

Group x1 has the following members: 
     title1 
     title2 

Group x3 has the following members: 
     title1 
     title3 

Group x2 has the following members: 
     title4 
Problemi correlati