2009-11-12 6 views
1

J'utilise l'extrait de code ci-dessous maintenant désérialiser le document XML ...désérialiser le document XML --- Besoin d'aide

[WebMethod] 
public XmlDocument OrderDocument(XmlDocument xmlDoc) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(sendOrder.Order)); 

    string xmlString = xmlDoc.OuterXml.ToString(); 

    byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlString); 

    MemoryStream ms = new MemoryStream(buffer); 

    sendOrder.Order orderDoc = (sendOrder.Order)serializer.Deserialize(ms); 

    sendOrder.WebService_ConsureWebService ws = 
     new sendOrder.WebService_ConsureWebService(); 

    ws.Operation_1(ref orderDoc); 

    return xmlDoc; 
} 

Quelqu'un peut-il dire s'il vous plaît ce qui ne va pas avec le code, comme l'erreur dit il y a une erreur dans le document XML, mais si vous vérifiez le document que je passe et même l'objet ordonner sa a la même structure et l'espace de noms

Il y a une erreur dans le document XML (1, 2) . ---> System.InvalidOperationException: http: //ConsureWebService.Order '> n'a pas été prévu.

+0

s'il vous plaît mettre en valeur vos sections de code dans l'éditeur, puis cliquez sur le bouton « code » (101 010) sur la barre d'outils de l'éditeur, ou appuyez sur Ctrl-K sur votre clavier, pour formater code (et obtenir la mise en évidence de la syntaxe et tous –

+0

Si vous définissez un point d'arrêt dans GetBytes(), quelle est la valeur de xmlString? – Ariel

+0

Vous ne pouvez pas simplement utiliser 'Order' comme argument pour votre méthode web? –

Répondre

2

Je suppose que c'est un problème d'espace de noms (c'est-à-dire des espaces de noms xml). Pouvez-vous montrer l'exemple xml et la classe Order?

Pour info, vous pouvez lire à partir d'un XmlDocument "comme est", via:

sendOrder.Order orderDoc; 
using(XmlReader reader = new XmlNodeReader(xmlDoc.DocumentElement)) { 
    orderDoc = (sendOrder.Order) serializer.Deserialize(reader); 
} 

beaucoup plus simple que de jouer avec le codage et les cours d'eau ...


Avec votre échantillon xml/code, vous pouvez résoudre ce problème en ajoutant:

[XmlRoot(Namespace = "ConsureWebService.Order")] 

à la classe. Si la classe s'annonce comme partial class, vous pouvez même le faire dans un fichier de code séparé, vous n'avez donc pas besoin de modifier le code généré. Ce serait (dans l'espace de noms correct):

[XmlRoot(Namespace = "ConsureWebService.Order")] 
public partial class Order { } 
+0

Le document XML que je passe est comme ci-dessous OrderId_0 OrderName_0 Howard

+0

En outre, c'est le SendOrder.objet de la commande J'essaie de désérialiser à: espace de noms SendOrder { [Serializable] [XmlType (AnonymousType = true, Namespace = "http: //ConsureWebService.Order")] [GeneratedCode ("System.Xml", "2.0.50727.3053")] [DebuggerStepThrough] [DesignerCategory ("code")] public class Ordre { public order(); public string OrderId {get; ensemble; } chaîne publique OrderName {get; ensemble; } } } – Howard

+0

XmlSerializer deserializer = nouveau XmlSerializer (typeof (sendOrder.Order)); sendOrder.Order orderDoc; en utilisant (lecteur XmlReader = nouveau XmlNodeReader (xmlDoc.DocumentElement)) { orderDoc = (sendOrder.Order) deserializer.Deserialize (lecteur); En utilisant l'extrait de code ci-dessus, pendant le débogage je reçois la valeur nulle pour le lecteur, je peux trouver le document xml pour le xmlDoc – Howard

0
<ns0:Order xmlns:ns0="ConsureWebService.Order">; 
     <OrderId>OrderId_0</OrderId> 
     <OrderName>OrderName_0</OrderName> 
</ns0:Order> 

Cela ne semble pas être un document xml valide entièrement, vous pouvez afficher la chose? C'est un peu comme donner à quelqu'un seulement la première ligne d'une trace de pile et dire "Eh bien!" .

EDIT

Voici une supposition: http://support.microsoft.com/kb/816225

Avez-vous un constructeur par défaut?

+0

PAS ce le document XML complet que je passe et que j'essaie de désérialiser à l'objet sendOrder.Order ... tous les deux j'ai posté comme un commentaire plus tôt – Howard

+0

Et si vous remarquez même l'espace de noms et la structure du document ... Je ne sais pas pourquoi l'erreur ci-dessous arrive .. System.Web.Services.Protocols.SoapException: Le serveur n'a pas pu traiter la demande. ---> System.InvalidOperationException: Il y a une erreur dans le document XML (1, 2). ---> System.InvalidOperationException: n'était pas attendu. – Howard

+0

Je suis en train désérialiser l'objet sendOrder.Order qui n'a namespace par défaut constructur SendOrder { [Serializable] [XmlType (AnonymousType = true, Namespace = "ConsureWebService.Order")] [GeneratedCode ("System.Xml" , "2.0.50727.3053")] [DebuggerStepThrough] [DesignerCategory ("code")] public class Ordre { public Commander(); public string OrderId {get; ensemble; } chaîne publique OrderName {get; ensemble; } } } – Howard

Questions connexes