2009-05-12 4 views
4

Ich deserialisiere eine XML-Datei, die von einem Webservice eines unserer Kunden kommt.C#: Deserialise XML File Fehler (denke, es ist ein Namespace-Problem - kann nicht für das Leben von mir aber arbeiten)

Problem ist, nach dem Erstellen der Klasse mit xsd.exe Ich deserialise die Datei und bekomme die übliche "Es ist ein Fehler in XML-Dokument (2, 2)." Visual Studio Fehler. Dies, nehme ich an ist die Linie 2, die die Namespace-Deklarationen Punkte:

Top of XML-Datei:

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

Aufeinander Klasse:

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

Ich nehme an, es ist ein Fehler beim:

[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)] 

Teil des XML, aber ich habe keine Ahnung, wofür ich es ändern soll - oder was VS will.

überhaupt Hilfe zu schätzen Jungs, ich bin noch ziemlich neu für all dies und mein Chef atmet, um mich die ganze Zeit diese Arbeit zu bekommen :(

EDIT: Es gibt eine innere Ausnahme ja ! Sorry, Jungs!

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

So, wie ich in die Klasse diese Namespace-Deklaration füge?

+0

Gibt es eine innere Ausnahme? – tpower

+0

Hi tpower, Innere Ausnahme ist: {" wurde nicht erwartet."} Wie füge ich diesen Namespace der Klasse hinzu also erwartet es?! – Gareth

Antwort

6

die Seife Umschlag nicht Teil des serialisierten Objekts ist. Es ist Teil des SOAP-Transport-Protokoll ist. Sie müssen entfernen dein o Binden Sie aus dem Umschlag, anstatt Ihr Objekt mit dem Umschlag zu beschäftigen.

Anstatt die gesamte XML-Datei zu nehmen (die aus irgendeinem Grund den Soap-Umschlag enthält), müssen Sie das erste Kind innerhalb des soap: body verwenden und THAT verwenden, um in Ihr Objekt zu deserialisieren.

Schauen Sie sich diese SO posten ...

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

..., die die Datei-Parsing-Adressen.

+0

Oohhh Ich fühle mich jetzt ein bisschen albern :) Abgesehen von dem manuellen Lesen der Datei, dann Extrahieren der Knoten, die ich will und übergibt sie an den Deserializer - gibt es eine andere, weniger schmutzige Gefühl, dies zu tun? – Gareth

+0

Ist dies zum Testen oder erhalten Sie (aus irgendeinem Grund) Ihre SOAP-Nachrichten im Dateiformat (anstatt als Teil eines ASMX/WCF-Stacks)? –

+0

Dies ist aus irgendeinem Grund genau, wie der Webservice das XML zurückgibt. Es wird nicht in VS mit der "Web-Referenz hinzufügen" integriert, so dass wir die Abfrage manuell POST und dann die HTTPResponse in XML zurücklesen müssen. Also, da es nicht die "traditionelle" Art und Weise analysiert wird, vermute ich, dass die Seifen-Header drin bleiben. es ist wirklich ein schreckliches und gehacktes System :( – Gareth

Verwandte Themen