2011-05-23 3 views
2

J'ai un fichier XML stocké dans la base de données en tant que tableau d'octets (octet []). Maintenant, je dois obtenir ce tableau d'octets à partir de la base de données que je fais avec succès et le transmettre à XDocument comme ce qui suit:octet [] vers XML avec .NET/C#

public Dictionary<string, string> ReadFromByte(byte[] UserData, string toplevelnode, string firstattribute, string secondattribute) 
     { 
      XDocument doc = XDocument.Load(UserData); 
      Dictionary<string, string> dictionary = doc.Descendants(toplevelnode).ToDictionary(x => x.Attribute(firstattribute).Value, 
                   x => x.Attribute(secondattribute).Value); 
      return dictionary; 
     } 

Ce code fonctionne bien si je passe à XDocument un fichier sur le serveur au format XML . Cependant, cela ne fonctionne pas si je passe un tableau byte []. Tout indice que je devrais convertir le tableau byte [] en XML serait grandement apprécié.

Merci.

+1

Comment avez-vous stocké le document xml dans la base de données? utiliser la sérialisation ou simplement utiliser des octets du contenu xml? – crypted

+0

Vous devriez pouvoir écrire la valeur du champ db dans un MemoryStream et envoyer ce flux au XDocument. – faester

+0

Oui, comment vous obtenez le XML hors de la base de données tout dépend de la façon dont vous l'avez obtenu là-bas en premier lieu. Vous devez nous dire comment vous l'avez eu dans la base de données. –

Répondre

5
using (var stream = new MemoryStream(UserData, false)) 
    { 
    var doc = Xdocument.Load(stream); 

    ... 
    } 

Comme @ INT3 demandé, nous devrions connaître le enocoding (UTF8/16, etc.) que vous avez utilisé pour stocker le document dans la base de données.

+0

J'ai écrit le XML dans un flux de mémoire comme suit: MemoryStream ms = new MemoryStream(); ms.Position = 0; XmlWriter writer = new XmlTextWriter (ms, Encoding.UTF8); Puis lire le flux de mémoire dans un tableau d'octets comme suit: byte [] biteArray = new byte [ms.Length]; Ms.Read (biteArray, 0, (int) ms.Length); – cycero

+0

Ok, ma réponse devrait alors fonctionner; car le document dans la BD devrait commencer par et XDocument.Load le lira correctement. –

+0

Si je vous aime bien, en passant le flux directement à XDocument, je reçois "Impossible de convertir le flux en chaîne." Et si j'aime ce qui suit: Xdocument.Load (stream) .ToString(), j'obtiendrai Impossible de trouver le fichier 'c: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ System.IO.MemoryStream'. – cycero