2009-08-05 7 views
3

J'ai un grand fichier xml et je veux en obtenir un nombre défini de <Cooperation> nœuds. Quelle est la meilleure façon de gérer cela.XDocument Obtenir une partie du fichier XML

Actuellement, je suis en utilisant ce code

public string FullCooperationListChunkGet(int part, int chunksize) 
{ 
    StringBuilder output_xml = new StringBuilder(); 
    IEnumerable<XElement> childList = from el in xml.Elements("Cooperations").Skip(part * chunksize).Take(chunksize) select el; 

    foreach (XElement x in childList.Elements()) 
    { 
     output_xml.Append(x.ToString()); 
    } 

    return output_xml.ToString(); 
} 

Skip(part * chunksize).Take(chunksize) ne fonctionne pas (semble être uniquement valable pour les coopérations Tag et non la Coopération Tags)

quelqu'un peut me diriger dans la bonne direction.

Merci,
RAYT

Edit:
Le fond est la suivante: je pousse ces parties XML via un webservice à un Blackberry. Malheureusement, la taille de la requête http sur un serveur d'entreprise BlackBerry est limitée par défaut à à 256 ko.

Une partie du fichier XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Cooperations> 
    <Cooperation> 
    <CooperationId>xxx</CooperationId> 
    <CooperationName>xxx</CooperationName> 
    <LogicalCustomers> 
     <LogicalCustomer> 
     <LogicalCustomerId>xxx</LogicalCustomerId> 
     <LogicalCustomerName>xxx</LogicalCustomerName> 
     <Customers> 
      <Customer> 
      <CustomerId>xxx</CustomerId> 
      <CustomerName>xxx/CustomerName> 
      </Customer> 
      <Customer> 
      <CustomerId>xxx</CustomerId> 
      <CustomerName>xxx</CustomerName> 
      </Customer> 
     </Customers> 
     </LogicalCustomer> 
     <LogicalCustomer> 
     <LogicalCustomerId>xxx</LogicalCustomerId> 
     <LogicalCustomerName>xxx</LogicalCustomerName> 
     <Customers> 
      <Customer> 
      <CustomerId>xxx</CustomerId> 
      <CustomerName>xxx</CustomerName> 
      </Customer> 
      <Customer> 
      <CustomerId>xxx</CustomerId> 
      <CustomerName>xxx</CustomerName> 
      </Customer> 
     </Customers> 
     </LogicalCustomer> 
     <LogicalCustomer> 
     <LogicalCustomerId>xxx</LogicalCustomerId> 
     <LogicalCustomerName>xxx</LogicalCustomerName> 
     <Customers> 
      <Customer> 
      <CustomerId>xxx</CustomerId> 
      <CustomerName>xxx</CustomerName> 
      </Customer> 
     </Customers> 
     </LogicalCustomer> 
    </LogicalCustomers> 
    </Cooperation> 
    <Cooperation> 
    ... 
+0

Quelle est la taille de la taille? –

+0

512 ko lol ... un moment, je vais ajouter l'arrière-plan. –

+0

lol; trouvé et corrigé - voir ma mise à jour –

Répondre

2

Pour utiliser XDocument, je vous attendre voulez quelque chose comme:

var qry = doc.Root.Elements("Cooperation").Skip(part*chunksize).Take(chunksize); 

Cependant, si les données sont grand, vous pourriez avoir pour descendre à XmlReader à la place ... Je vais essayer de faire un exemple ... (mise à jour; 512kb ne vaut probablement pas la peine ...)

Le problème avec votre code est que vous utilisez .Elements() ici:

foreach (XElement x in childList.Elements()) 
{ 
    output_xml.Append(x.ToString()); 
} 

Tout supprimer que:

foreach (XElement x in childList) 
{ 
    output_xml.Append(x.ToString()); 
} 

Pour info - vous utilisez également la syntaxe de requête inutilement:

IEnumerable<XElement> childList = from el in xml.Elements("Cooperations") 
    .Skip(part * chunksize).Take(chunksize) select el; 

est 100% identique à:

IEnumerable<XElement> childList = xml.Elements("Cooperations") 
    .Skip(part * chunksize).Take(chunksize); 

(puisque le compilateur ignore une select évidente, sans mapper à la méthode Select LINQ)

+0

Salut Marc, j'ai déjà essayé ça. Mais alors les balises d'ouverture et de fermeture sont manquantes. –

+0

ne peut pas reproduire ... si vous voulez dire que les balises '' sont manquantes ... puis les ajouter manuellement? –

+0

la sortie commence par xxx ... et non l'étiquette d'ouverture

1

Avez-vous un document XML ou un fragment, i.e. avez-vous plus de 1 noeuds « cooperations »? Si vous en avez plus, quelle coopération espérez-vous obtenir? À partir de seulement 1 Coopérations ou à travers plusieurs, la raison de demander est que vous avez écrit xml.Element s ("Coopérations").

Ne serait-ce faire l'affaire:

xml.Element("Cooperations").Elements("Cooperation").Skip(...).Take(...) 
+0

Non .. un seul tag . –

+0

Merci, mais les étiquettes de coopération manquent ici aussi. –

+0

foreach (var xx dans x.Element ("Coopérations"). Eléments ("Coopération"). Skip (2) .Take (3)) { Console.WriteLine (xx.Name); } donnez-moi "Coopération" * 3 ... – veggerby

0

Vous pouvez le faire en utilisant System.Net au lieu de LINQ, bien qu'il serait tout à fait désordre.Juste pour vous donner une idée sur la façon dont vous pouvez lire des extraits d'une réponse http:

// Get the HTTP response 
string url = "http://someurl.com/myxml.xml"; 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
// Build a stream 
Stream stream = response.GetResponseStream(); 
Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 
StreamReader reader = new StreamReader(stream, encode); 

// Loop the file 
Char[] read = new Char[256]; 
int count = reader.Read(read, 0, 256); 
while (count > 0) { 
    String str = new String(read, 0, count); 
    count = reader.Read(read, 0, 256); 
} 
response.Close(); 
stream.Close(); 

Vous pouvez utiliser la pagination en ajustant la count et la recherche en même temps str pour les balises XML.

Questions connexes