2016-04-15 9 views
0

Ich werde damit beginnen, ich habe alle anderen Antworten auf diese Frage gelesen und alle von ihnen (wenn auch gute Lösungen) funktionierte nicht in meinem FallFehler beim Deserialisieren von XML in C# -Klasse abgeleitet von xsd.exe mit Namespace

ich mit

aC# Klasse von meiner XSD-Datei erstellt

xsd.exe/c neworder.xsd

es erzeugt eine Klasse von 7000+ Linien so werde ich es relevante Teile schreiben.

using System; 
using System.Diagnostics; 
using System.Xml.Serialization; 
using System.Collections; 
using System.Xml.Schema; 
using System.ComponentModel; 
using System.IO; 
using System.Text; 
using System.Xml; 
using System.Collections.Generic; 


[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234")] 
[System.SerializableAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.foo.com/schemas/w/v1.0")] 
[System.Xml.Serialization.XmlRootAttribute("new-order", Namespace = "http://www.foo.com/schemas/w/v1.0")] 
public partial class neworder 
{ 

    private List<customertype> customersField; 

    private string suppliercodeField; 

    private string versionField; 

    private static System.Xml.Serialization.XmlSerializer serializer; 

    public neworder() 
    { 
     this.customersField = new List<customertype>(); 
    } 

    [System.Xml.Serialization.XmlArrayAttribute(Order = 0)] 
    [System.Xml.Serialization.XmlArrayItemAttribute("customer",IsNullable = false)] 
    public List<customertype> customers 
    { 
     get 
     { 
      return this.customersField; 
     } 
     set 
     { 
      this.customersField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute("supplier-code")] 
    public string suppliercode 
    { 
     get 
     { 
      return this.suppliercodeField; 
     } 
     set 
     { 
      this.suppliercodeField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlAttributeAttribute("version")] 
    public string version 
    { 
     get 
     { 
      return this.versionField; 
     } 
     set 
     { 
      this.versionField = value; 
     } 
    } 

    private static System.Xml.Serialization.XmlSerializer Serializer 
    { 
     get 
     { 
      if ((serializer == null)) 
      { 
       serializer = new System.Xml.Serialization.XmlSerializer(typeof(neworder)); 
      } 
      return serializer; 
     } 
    } 
public static neworder Deserialize(string xml) 
     { 
      System.IO.StringReader stringReader = null; 
      try 
      { 
       stringReader = new System.IO.StringReader(xml); 
       return ((neworder)(Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader)))); 
      } 
      finally 
      { 
       if ((stringReader != null)) 
       { 
        stringReader.Dispose(); 
       } 
      } 
     } 

Das ist nur ein kleiner Ausschnitt ist, der Rest ist nicht so wichtig, gerade jetzt, da ich das Gefühl, wenn dieses Problem gelöst wird, ich den Rest lösen kann.

Dies ist der Anfangsteil der XML-Datei

<new-order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.foo.com/schema/w/v1.0" version="1.0" supplier-code="FAKECODE" schemaLocation="http://www.foo.com/schemas/w/v1.0/TransmissionEnvelope.xsd"> 
    <customers> 
    <customer w-number="123456" customer-number="12345-12345"> 
     <client-info> 
     <client-name>John Doe</client-name> 
     <w-id>433348</w-id> 
     </client-info> 
     <transferee-name> 
     <first>John</first> 
     <last>Doe</last> 
     </transferee-name> 
     <spouse-name> 
     <first /> 
     <last /> 
     </spouse-name> 
     <o-address> 
     <street1>123 Fake st</street1> 
     <city>Fakeville</city> 
     <state>CA</state> 
     <postal-code>90210</postal-code> 
     <country>USA</country> 
     </o-address> 
     <d-address> 
     <street1 /> 
     <city>harbour</city> 
     <state>VA</state> 
     <postal-code>55555</postal-code> 
     <country>USA</country> 
     </d-address> 
     <contact-info> 
     <phone> 
      <phone-type>CELL</phone-type> 
      <phone-number>555-555-5555</phone-number> 
     </phone> 
     <phone> 
      <phone-type>HOME</phone-type> 
      <phone-number>555-555-5555</phone-number> 
     </phone> 
     <phone> 
      <phone-type>WORK</phone-type> 
      <phone-number /> 
     </phone> 
     <email>[email protected]</email> 
     <comments>Just any comments here</comments> 
     </contact-info> 

    </customer> 
    </customers> 
</new-order> 

ich versuche, es zu deserialisieren mit folgendem

XmlSerializer ser = new XmlSerializer(typeof(neworder)); 
    neworder feed = (neworder)ser.Deserialize(new FileStream(filePath, FileMode.Open)) ; 

Der Fehler, ich erhalte, ist die berüchtigte:

Es gibt ein Fehler im XML-Dokument (1, 2). http://www.foo.com/schema/w/v1.0 '> wurde nicht erwartet.

Ich habe immer wieder gelesen über die Stammnotiz als Attribut XMLROOT, die das obige tut. Und es hat den richtigen Namensraum.

Ich habe versucht, XmlRootAttribute zu XmlRoot zu ändern. Nichts. Ich habe versucht, den Namespace zu entfernen und die Klasse und nichts wieder zu tun.

Wrecking mein Gehirn auf was könnte hier falsch sein, weil alles scheint echt.

+0

Veröffentlichen Sie das Schema und die XML-Datei. – Aybe

+0

Können Sie eine vollständige XML-Datei posten (möglicherweise eine, die abgespeckt wurde)? Ich konnte die Ausnahme stoppen, indem ich 's' zu' schema' hinzufügte: 'xmlns =" ​​http://www.foo.com/schemas/w/v1.0 "', aber ich weiß es nicht wenn es Probleme gibt, indem man mit einer "xml-Datei" testet, ist das * nur * das '' -Element. – Quantic

+0

Hinzugefügt XML-Datei. Ich möchte das Schema nicht veröffentlichen, weil es nicht ** mein ** Schema ist. Was ich als temporäre Problemumgehung getan habe (wir werden sehen, ob es für alle Testdokumente schwenkt) Ich habe eine XSD-Datei mit xsd.exe aus einem der Testdokumente erstellt, aus denen ich dann die Klasse erstellt habe. Es funktioniert auf dem einen XML-Dokument, aber ich versuche mehrere. Nicht die Art, wie ich gehen will, aber na ja. – reindeerKurt

Antwort

0

Versuchen Sie dies .... (für die XML, die Sie gebucht haben)

Mit .....

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 
using System.Xml.Serialization; 

Klassen .....

[XmlRoot(ElementName = "client-info", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Clientinfo 
{ 
    [XmlElement(ElementName = "client-name", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Clientname { get; set; } 
    [XmlElement(ElementName = "w-id", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Wid { get; set; } 
} 

[XmlRoot(ElementName = "transferee-name", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Transfereename 
{ 
    [XmlElement(ElementName = "first", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string First { get; set; } 
    [XmlElement(ElementName = "last", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Last { get; set; } 
} 

[XmlRoot(ElementName = "spouse-name", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Spousename 
{ 
    [XmlElement(ElementName = "first", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string First { get; set; } 
    [XmlElement(ElementName = "last", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Last { get; set; } 
} 

[XmlRoot(ElementName = "o-address", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Oaddress 
{ 
    [XmlElement(ElementName = "street1", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Street1 { get; set; } 
    [XmlElement(ElementName = "city", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string City { get; set; } 
    [XmlElement(ElementName = "state", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string State { get; set; } 
    [XmlElement(ElementName = "postal-code", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Postalcode { get; set; } 
    [XmlElement(ElementName = "country", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Country { get; set; } 
} 

[XmlRoot(ElementName = "d-address", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Daddress 
{ 
    [XmlElement(ElementName = "street1", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Street1 { get; set; } 
    [XmlElement(ElementName = "city", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string City { get; set; } 
    [XmlElement(ElementName = "state", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string State { get; set; } 
    [XmlElement(ElementName = "postal-code", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Postalcode { get; set; } 
    [XmlElement(ElementName = "country", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Country { get; set; } 
} 

[XmlRoot(ElementName = "phone", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Phone 
{ 
    [XmlElement(ElementName = "phone-type", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Phonetype { get; set; } 
    [XmlElement(ElementName = "phone-number", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Phonenumber { get; set; } 
} 

[XmlRoot(ElementName = "contact-info", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Contactinfo 
{ 
    [XmlElement(ElementName = "phone", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public List<Phone> Phone { get; set; } 
    [XmlElement(ElementName = "email", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Email { get; set; } 
    [XmlElement(ElementName = "comments", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public string Comments { get; set; } 
} 

[XmlRoot(ElementName = "customer", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Customer 
{ 
    [XmlElement(ElementName = "client-info", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Clientinfo Clientinfo { get; set; } 
    [XmlElement(ElementName = "transferee-name", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Transfereename Transfereename { get; set; } 
    [XmlElement(ElementName = "spouse-name", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Spousename Spousename { get; set; } 
    [XmlElement(ElementName = "o-address", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Oaddress Oaddress { get; set; } 
    [XmlElement(ElementName = "d-address", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Daddress Daddress { get; set; } 
    [XmlElement(ElementName = "contact-info", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Contactinfo Contactinfo { get; set; } 
    [XmlAttribute(AttributeName = "w-number")] 
    public string Wnumber { get; set; } 
    [XmlAttribute(AttributeName = "customer-number")] 
    public string Customernumber { get; set; } 
} 

[XmlRoot(ElementName = "customers", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Customers 
{ 
    [XmlElement(ElementName = "customer", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Customer Customer { get; set; } 
} 

[XmlRoot(ElementName = "new-order", Namespace = "http://www.foo.com/schema/w/v1.0")] 
public class Neworder 
{ 
    [XmlElement(ElementName = "customers", Namespace = "http://www.foo.com/schema/w/v1.0")] 
    public Customers Customers { get; set; } 
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsi { get; set; } 
    [XmlAttribute(AttributeName = "xmlns")] 
    public string Xmlns { get; set; } 
    [XmlAttribute(AttributeName = "version")] 
    public string Version { get; set; } 
    [XmlAttribute(AttributeName = "supplier-code")] 
    public string Suppliercode { get; set; } 
    [XmlAttribute(AttributeName = "schemaLocation")] 
    public string SchemaLocation { get; set; } 
} 

-Code .....

 string strXML = File.ReadAllText("xml.xml"); 
     byte[] bufXML = ASCIIEncoding.UTF8.GetBytes(strXML); 
     MemoryStream ms1 = new MemoryStream(bufXML); 

     // Deserialize to object 
     XmlSerializer serializer = new XmlSerializer(typeof(Neworder)); 
     try 
     { 
      using (XmlReader reader = new XmlTextReader(ms1)) 
      { 
       Neworder deserializedXML = (Neworder)serializer.Deserialize(reader); 

      }// put a break point here and mouse-over deserializedXML…. 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

Ich lese Ihre XML in eine Zeichenfolge aus Eine Datei im Anwendungsbuild-Ordner namens xml.xml ... Sie müssen die XML-Zeichenfolge von woanders abrufen oder die XML.xml-Datei erstellen und Ihr XML für den obigen Code speichern

+0

Dies tatsächlich funktioniert super! sehr sauber auch. Vielen Dank. Ich bin immer noch neugierig auf was eigentlich falsch mit der Xsd-Version der Klasse auch, weil ** in der Theorie ** sollte es funktionieren, aber ich kann nicht herausfinden, warum. Dies ** funktioniert aber mit der XML-Datei. Ich muss an mehreren Proben testen. – reindeerKurt

+0

Gut zu helfen .... vielleicht wählen Sie diese Lösung als die Antwort, wenn es Ihr Problem gelöst hat ... Prost .... – Monty

+0

@rendeerKurt Ich weiß nichts über Schemas, aber Ihre 'schemaLocation' scheint falsch zu sein. Zum einen verweist es auf eine URL, die nicht in Ihrer Namespace-Liste enthalten ist (Sie haben es auf "http: // www.foo.com/schema/w/v1.0" gezeigt, während Ihr Namespace "http://www.foo.com" hat/schemas/w/v1.0. Zweitens scheint es, dass es sich um eine durch Leerzeichen getrennte Liste handelt, in der Ihre '.xsd' nach dem Leerzeichen steht, siehe [hier] (https://msdn.microsoft.com/ de-de/library/ms256100 (v = vs.110) .aspx), es sei denn, Sie möchten dies möglicherweise: https://msdn.microsoft.com/en-us/library/ms256139(v=vs.110).aspx – Quantic

Verwandte Themen