XML Deserialization error: xxxxx was not expected

XML Deserialization error: xxxxx was not expected

我知道有几篇帖子与此主题有关,但我似乎无法弄清楚这里的问题是什么。我已经序列化和反序列化了好几次xml,从来没有出现过这个错误。

异常信息为:

There is an error in XML document (1, 2).

有 InnerException:

<InvoiceChangeRequest xmlns=''> was not expected.

XML 我要反序列化的文件:

<ns1:InvoiceChangeRequest xmlns:ns1="http://kmd.dk/fie/external_invoiceDistribution">
    <CONTROL_FIELDS>
        <STRUCTURID>0000000001</STRUCTURID>
        <OPERA>GET</OPERA>
        <WIID>000050371220</WIID>
    </CONTROL_FIELDS>
    <HEADER_IN>
        <MANDT>751</MANDT>
        <BELNR>1234567890</BELNR>
    </HEADER_IN>
    <ITEMS>
        <ITEM_FIELDS_IN>
            <BUZEI>001</BUZEI>
            <BUKRS>0020</BUKRS>
        </ITEM_FIELDS_IN>
    </ITEMS>
</ns1:InvoiceChangeRequest>

Class 我正在尝试反序列化为:

[XmlRoot(Namespace = "http://kmd.dk/fie/external_invoiceDistribution", IsNullable = false)]
public class InvoiceChangeRequest
{
    [XmlElement("CONTROL_FIELDS")] public ControlFields Styrefelter;
    [XmlElement("HEADER_IN")] public HeaderIn HeaderfelterInd;
    [XmlElement("ITEMS")] public Items Linjer;
}

public class HeaderIn
{
    [XmlElement("MANDT")] public string Kommunenummer;
    [XmlElement("BELNR")] public string RegnskabsbilagsNummer;
}

public class Items
{
    [XmlElement("ITEM_FIELDS_IN")] public Itemfield[] ItemfelterInd;
}

public class Itemfield
{
    [XmlElement("BUZEI")] public string Linjenummer;
    [XmlElement("BUKRS")] public string Firmakode;
}

反序列化代码:

XmlSerializer serializer = new XmlSerializer(typeof(InvoiceChangeRequest));
var request = serializer.Deserialize(new StringReader(output)) as InvoiceChangeRequest;

您可以将 'ns1:' 替换为 string.Empty。

类以下应该连载。

public class Item
{
    [XmlElement("BUZEI")]
    public string Buzei { get; set; }

    [XmlElement("BUKRS")]
    public string Bukrs { get; set; }
}

public class Header
{
    [XmlElement("MANDT")]
    public string Mandt { get; set; }

    [XmlElement("BELNR")]
    public string Belnr { get; set; } 
}

public class ControlFields
{
    [XmlElement("STRUCTURID")]
    public string StructuredId { get; set; }

    [XmlElement("OPERA")]
    public string Opera { get; set; }

    [XmlElement("WIID")]
    public string Wild { get; set; } 
}

public class InvoiceChangeRequest
{
    [XmlElement("CONTROL_FIELDS")]
    public ControlFields ControlFields { get; set; }

    [XmlElement("HEADER_IN")]
    public Header Header { get; set; }

    [XmlArray("ITEMS")]
    [XmlArrayItem("ITEM_FIELDS_IN")]
    public List<Item> Items { get; set; }
}

在您的 XML 文件中,您的根元素是带有前缀 ns1.

的命名空间 http://kmd.dk/fie/external_invoiceDistribution

元素 <CONTROL_FIELDS> 不是,因为它没有前缀。不过,您的序列化 class 并未考虑到这一点。这意味着它期望 <CONTROL_FIELDS> 和其他元素也在 ns1 命名空间中。

要让序列化程序正确解析元素,请将 Namespace 添加到元素中,将其设置为空字符串:

[XmlRoot(Namespace = "http://kmd.dk/fie/external_invoiceDistribution", IsNullable = false)]
public class InvoiceChangeRequest
{
    [XmlElement("CONTROL_FIELDS", Namespace = "")]
    public ControlFields Styrefelter { get; set; }
    [XmlElement("HEADER_IN", Namespace = "")]
    public HeaderIn HeaderfelterInd { get; set; }
    [XmlElement("ITEMS", Namespace = "")]
    public Items Linjer { get; set; }
}

这将按预期反序列化给定的 XML。

如果出现反序列化问题,我通常会在内存中创建 classes,然后将其序列化,这样我就可以检查生成的 XML。这通常会提供与输入文档相比缺少或添加的内容的线索:

        var ms = new MemoryStream();
        serializer.Serialize(ms, new InvoiceChangeRequest {
            Styrefelter = new ControlFields {  Opera="test"}
        });
        var s = Encoding.UTF8.GetString(ms.ToArray());

然后检查 s 差异。