2016-11-25 18 views
0

XMLをデシリアライズして例外を取得したい<ehd xmlns='urn:ehd/001> was not expected。私は別の名前空間を試しましたが何も助けなかったので、私はそれを解決するために何ができるのか分かりません。XMLの予期しない用語

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.."/> 

そして、ここでデシリアライゼーションのための私のコード:

 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()); 
     } 

そして、ここで直列化可能クラス:

[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; } 
    } 
} 

答えて

0

主な問題は、定義したクラスが、デシリアライズしているドキュメントの断片のみを表していることです。少なくともehd要素とbody要素を表すクラスを定義する必要があり、body要素にはkostentraeger_listeが含まれます。必要最小限は次のとおりです。

[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を参照してください。

-1

あなたは親ノードを必要としますehd名前空間を定義する:

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

これは 'ehd'要素の属性によって既に定義されていますか?問題は、ターゲットクラス定義がドキュメント内のフラグメントのみを表すことです。 –

+0

ポストされたコードは '<?xml'で始まっているので、フラグメントではありません。 – jdweng

+0

私が言ったように、*クラス*はドキュメントの断片だけを表しています。このエラーは、XMLがクラス定義と一致しないために発生します。 –

関連する問題