2012-05-26 29 views
6

Necesito agrupar el valor de "Documento" de XML. El problema se debe a que el valor clave (productType) puede ser múltiple.Cómo agrupar datos XML por valor múltiple

Esta es 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> 

Y esto es lo que trato:

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

Mi código está trabajando sólo si hay un elemento ProductType. ¿Cómo puedo cambiar mi código para que funcione si hay varios valores de productType?

+0

es el documento (1) es un grupo diferente, o debería entrar en los grupos del Documento (2) y el documento (3) al mismo tiempo? ¿Puedes mostrar tu salida esperada? –

+1

Habrá tres grupos: 1) el documento (1) y el documento (2) estarán bajo la clave "Capital Costs Analysis Forum - Brazil" 2) el documento (1) y el documento (3) estarán debajo de la clave " Medio ambiente, salud y seguridad & Sostenibilidad " 3) el documento (4) estará debajo de la clave" Defensa, riesgo & Seguridad " Mi problema es el caso 2. Gracias por su respuesta. – drazen

Respuesta

2

Usted no explica qué resultado que desea pero sospecha que desea que la siguiente agrupación:

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

siendo la entrada

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

que da salida a

Group x1 has the following members: 
     title1 
     title2 

Group x3 has the following members: 
     title1 
     title3 

Group x2 has the following members: 
     title4