2012-05-26 21 views
6

Muszę zgrupować wartość "Dokumentu" z XML. Problem polega na tym, że wartość klucza (productType) może być wielokrotnością.Jak grupować dane XML według wielu wartości

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

I to właśnie staram:

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

mój kod działa tylko wtedy, gdy istnieje jeden element Producttype. Jak zmienić mój kod, aby działał, jeśli istnieje wiele wartości productType?

+0

Czy dokument (1) jest inną grupą, czy też powinna należeć do grup dokumentów (2) i dokumentów (3) w tym samym czasie? Czy możesz pokazać swoje oczekiwane wyniki? –

+1

Będą trzy grupy: 1) dokument (1) i dokument (2) będą pod kluczem "Analiza kosztów kapitałowych Forum - Brazylia" 2) dokument (1) i dokument (3) będą pod kluczem " Ochrona środowiska, zdrowie i bezpieczeństwo & Zrównoważony rozwój " 3) dokument (4) będzie pod kluczem" Obrona, ryzyko & Bezpieczeństwo " Mój problem dotyczy przypadku 2. Dziękujemy za odpowiedź. – drazen

Odpowiedz

2

Nie wyjaśnić, co skutkować chcesz, ale podejrzewam, że chcesz następujące ugrupowania:

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

z wejściem będąc

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

że wyprowadza

Group x1 has the following members: 
     title1 
     title2 

Group x3 has the following members: 
     title1 
     title3 

Group x2 has the following members: 
     title4 
Powiązane problemy