2016-11-25 4 views
0

Ich möchte ein XML deserialisieren und eine Ausnahme erhalten <ehd xmlns='urn:ehd/001> was not expected. Ich habe verschiedene Namespaces ausprobiert, aber nichts half und daher habe ich keine Ahnung, was ich tun kann, um es zu lösen.Unerwarteter Ausdruck in XML

Die ersten Zeilen des XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/kts/001"> 
<ehd:header> 
    <ehd:id EX="11944b3a-4f86-4da2-af6e-e24bedd6b523" RT="74"/> 
    <ehd:document_type_cd V="KTS"/> 
</ehd:header> 
<ehd:body> 
    <kostentraeger_liste> 
     <kostentraeger V="01101"> 
      <gueltigkeit V="1994-01-01.."/> 

Und hier mein Code für Deserialisation:

 var stream = new FileStream(@"I:\medatis\kleinprojekte\KassenlisteKBV\KbvRohdaten\KTStamm_2017_1.xml", FileMode.Open, FileAccess.Read); 
     var seri = new XmlSerializer(typeof(KostentraegerListe)); 
     KostentraegerListe liste = null; 

     try 
     { 
      liste = (KostentraegerListe) seri.Deserialize(stream); 
      stream.Close(); 
     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.GetBaseException()); 
     } 

Und hier die serializable Klassen:

[Serializable] 
[DebuggerStepThrough] 
[XmlType(AnonymousType = true)] 
[XmlRoot(ElementName="kostentraeger_liste", Namespace = "urn:ehd/001", IsNullable = false)] 
public class KostentraegerListe 
{ 
    private List<Kostentraeger> _kostentraegerListe; 

    [XmlElement("kostentraeger")] 
    public List<Kostentraeger> Kostentraeger 
    { 
     get { return _kostentraegerListe ?? (_kostentraegerListe = new List<Kostentraeger>()); } 
     set { _kostentraegerListe = value; } 
    } 
} 

[SerializableAttribute] 
[DebuggerStepThrough] 
[XmlType(AnonymousType = true)] 
public class Kostentraeger 
{ 
    private string _kostentraegernummer = String.Empty; 

    [XmlAttribute("V")] 
    public string Kostentraegernummer 
    { 
     get { return _kostentraegernummer; } 
     set { _kostentraegernummer = value; } 
    } 
} 

Antwort

0

Das Hauptproblem besteht darin, dass die von Ihnen definierten Klassen nur ein Fragment des Dokuments darstellen, das Sie deserialisieren. Sie müssen Klassen definieren, die mindestens die Elemente ehd und body darstellen, und das Element body enthält kostentraeger_liste. Das absolute Minimum erforderlich unter:

[XmlRoot("ehd", Namespace = "urn:ehd/001")] 
public class Ehd 
{ 
    [XmlElement("body")] 
    public Body Body { get; set; } 
} 

public class Body 
{ 
    [XmlElement("kostentraeger_liste", Namespace = "urn:ehd/kts/001")] 
    public KostentraegerListe KostentraegerListe { get; set; } 
} 

public class KostentraegerListe 
{ 
    [XmlElement("kostentraeger")] 
    public List<Kostentraeger> Kostentraeger { get; set; } 
} 

public class Kostentraeger 
{ 
    [XmlAttribute("V")] 
    public string Kostentraegernummer { get; set; } 
} 

this fiddle für eine Arbeits Demo ansehen.

-1

Sie benötigen einen übergeordneten Knoten das definiert den ehd-Namensraum:

<?xml version="1.0" encoding="iso-8859-1"?> 
<Root xmlns:ehd="Add a namespace here"> 
    <ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/kts/001"> 
    <ehd:header> 
     <ehd:id EX="11944b3a-4f86-4da2-af6e-e24bedd6b523" RT="74"/> 
     <ehd:document_type_cd V="KTS"/> 
    </ehd:header> 
    <ehd:body> 
     <kostentraeger_liste> 
     <kostentraeger V="01101"> 
      <gueltigkeit V="1994-01-01.."/> 
     </kostentraeger> 
     </kostentraeger_liste> 
    </ehd:body> 
    </ehd:ehd> 
</Root> 
+0

Dies ist bereits durch das Attribut im'Ehd' Element definiert? Das Problem besteht darin, dass die Zielklassendefinitionen nur ein Fragment im Dokument darstellen. –

+0

Der gepostete Code begann mit ' jdweng

+0

Wie gesagt, die * classes * repräsentieren nur ein Fragment des Dokuments. Der Fehler wird verursacht, weil das XML nicht mit den Klassendefinitionen übereinstimmt. –