XML反序列化错误:不期望xxxxx

时间:2015-11-24 15:17:43

标签: c# xml deserialization xml-deserialization

我知道这个主题有几个帖子,但我似乎无法弄清楚这里有什么问题。我已经多次序列化和反序列化了xml,并且从未出现过这个错误。

异常消息为:

  

XML文档(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>

我要尝试反序列化为:

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

2 个答案:

答案 0 :(得分:2)

在您的XML文件中,您的根元素是名称空间public class EventTypes { public string EventCode { get; set; } public string EventType { get; set; } } ,前缀为http://kmd.dk/fie/external_invoiceDistribution

元素ns1不是因为它没有前缀。您的序列化课程并未将此考虑在内。这意味着它期望<CONTROL_FIELDS>命名空间中<CONTROL_FIELDS>和其他元素也是。

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

Namespace

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

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

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

然后检查 var ms = new MemoryStream(); serializer.Serialize(ms, new InvoiceChangeRequest { Styrefelter = new ControlFields { Opera="test"} }); var s = Encoding.UTF8.GetString(ms.ToArray()); 是否存在差异。

答案 1 :(得分:0)

您可以替换“ns1:&#39;与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; }
}