2009-05-12 6 views
4

Je désérialise un fichier XML qui provient d'un webservice d'un de nos clients. Le problème est, après avoir créé la classe avec xsd.exe, je désérialise le fichier et obtiens l'habituel "Il y a une erreur dans le document XML (2, 2)." erreur de studio visuel. Ceci, je suppose est la ligne 2, qui pointe vers les déclarations d'espace de noms:C#: Erreur de fichier XML Deserialise (je pense que c'est un problème d'espace de noms - je ne peux rien pour la vie)

Haut de fichier XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"> 
<soapenv:Body><MXWorkorderOutResp language="EN" xmlns="http://www.mro.com/mx/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Header event="0" operation="Response" rsCount="8" rsStart="0" rsTotal="8"> 
    <SenderID build="127" dbbuild="V600-467" majorversion="6" minorversion="1" type="MAXIMO">MX</SenderID> 
    <CreationDateTime>2009-05-11T09:48:51+01:00</CreationDateTime> 
    <RecipientID>SUPPLIER</RecipientID> 
    <MessageID>12420317323327108</MessageID> 
    </Header> 
    <Content> 
    <MXWORKORDER> 
     <WORKORDER> 

Haut de classe:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.mro.com/mx/integration")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mro.com/mx/integration", IsNullable=false)] 


public partial class MXWorkorderOutResp { 

private MXWorkorderOutRespHeader[] headerField; 

private MXWorkorderOutRespContentMXWORKORDERWORKORDER[][][] contentField; 

private string languageField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("Header")] 
public MXWorkorderOutRespHeader[] Header { 
    get { 
     return this.headerField; 
    } 
    set { 
     this.headerField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlArrayItemAttribute("MXWORKORDER", typeof(MXWorkorderOutRespContentMXWORKORDERWORKORDER[]), IsNullable=false)] 
[System.Xml.Serialization.XmlArrayItemAttribute("WORKORDER", typeof(MXWorkorderOutRespContentMXWORKORDERWORKORDER), IsNullable=false, NestingLevel=1)] 
public MXWorkorderOutRespContentMXWORKORDERWORKORDER[][][] Content { 

Je présume qu'il ya une erreur avec le:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.mro.com/mx/integration")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mro.com/mx/integration", IsNullable=false)] 

partie du XML, mais je n'ai aucune idée de ce qu'il faut changer - ou ce VS veut.

toute aide à tous les gars apprécié, je suis encore assez nouveau pour tout cela et mon patron me respiration vers le bas tout le temps pour obtenir ce travail :(

EDIT: Il y a une exception interne oui ! Désolé les gars!

{"<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'> was not expected."} 

Alors, comment puis-je ajouter cette déclaration d'espace de noms à la classe?

+0

Existe-t-il une exception interne? – tpower

+0

Hi tpower, L'exception interne est: {" n'était pas prévu."} Comment ajouter cet espace de noms à la classe alors ça l'attend ?! – Gareth

Répondre

6

l'enveloppe de savon ne fait pas partie de votre objet sérialisé. cela fait partie du protocole de transport SOAP. Vous devez supprimer Ton o bjecter de l'enveloppe, plutôt que de faire votre objet face à l'enveloppe. Au lieu de prendre tout le fichier xml (qui, pour une raison ou une autre, inclut l'enveloppe de savon), vous devez prendre le premier enfant dans le soap: body et utiliser THAT pour le désérialiser dans votre objet.

Vérifiez ce post SO ...

Using C# and XDocument/XElement to parse a Soap Response

... qui traite de l'analyse de fichiers.

+0

oohhh Je me sens un peu bête maintenant :) En plus de lire manuellement le fichier, puis d'extraire les nœuds que je veux et de les passer au désérialiseur, y a-t-il un autre moyen de le faire? – Gareth

+0

Est-ce pour tester, ou est-ce que vous (pour une raison quelconque) obtenez vos messages SOAP au format de fichier (plutôt que dans le cadre d'une pile ASMX/WCF)? –

+0

c'est, pour une raison quelconque, exactement comment le service Web renvoie le XML. il ne s'intégrera pas dans VS en utilisant le "Ajouter une référence Web", nous devons donc POST manuellement la requête, puis relire la réponse HTTP en XML. Donc, comme il n'est pas analysé la façon «traditionnelle» je présume que les têtes de savon sont laissés en place. c'est vraiment un système terrible et piraté :( – Gareth

Questions connexes