简体   繁体   English

XML中的意外术语

[英]Unexpected term in XML

I want to deserialize an XML an get an exception <ehd xmlns='urn:ehd/001> was not expected . 我想反序列化XML,但不会出现异常<ehd xmlns='urn:ehd/001> was not expected I have tried different namespaces but nothing helped and so I have no idea what I can do to resolve it. 我尝试了不同的名称空间,但没有任何帮助,因此我不知道该如何解决。

The first lines of the 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.."/>

And here my code for 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());
        }

And here the serializable classes: 这里是可序列化的类:

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

The main issue is that the classes you've defined only represent a fragment of the document you are deserialising. 主要问题是,您定义的类仅表示要反序列化的文档的一部分。 You need to define classes to represent at least the ehd and body elements, and the body element will contain kostentraeger_liste . 您需要定义至少代表ehdbody元素的类,并且body元素将包含kostentraeger_liste The bare minimum required is below: 最低要求如下:

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

See this fiddle for a working demo. 请参阅此小提琴以获得有效的演示。

You need a parent node that defines the ehd namespace: 您需要一个定义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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM