【问题标题】:Unexpected term in XMLXML 中的意外术语
【发布时间】:2016-11-25 20:34:37
【问题描述】:

我想反序列化一个 XML 并得到一个异常 <ehd xmlns='urn:ehd/001> was not expected。我尝试了不同的命名空间,但没有任何帮助,所以我不知道我能做些什么来解决它。

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

【问题讨论】:

    标签: c# xml xml-deserialization


    【解决方案1】:

    主要问题是您定义的类仅代表您正在反序列化的文档的一个片段。您需要定义类以至少表示ehdbody 元素,而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 以获得工作演示。

    【讨论】:

      【解决方案2】:

      您需要一个定义 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>
      

      【讨论】:

      • 这已经被ehd元素中的属性定义了?问题是目标类定义仅代表文档中的一个片段。
      • 发布的代码以'
      • 正如我所说,classes 仅代表文档的一个片段。该错误是由于 XML 与类定义不匹配而引起的。
      • 该错误是由于未定义命名空间引起的。
      • 不是,因为正如我所解释的,它是被定义的。 XML 有效。
      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2010-10-20
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多