2015-11-24 4 views
1

Я знаю, что есть несколько сообщений с этой темой, но я не могу понять, в чем проблема. Я несколько раз сериализовал и десериализовал xml и никогда не имел этой ошибки.Ошибка десериализации XML: xxxxx не ожидалось

Сообщение Исключение:

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> 

класс Я пытаюсь десериализации к:

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

Неверный XML-код. XML может иметь только один корневой тег, и у вас есть несколько тегов на корневом уровне. Первая строка не является допустимым тегом sine, нет закрывающего тега ns1: InvoiceChangeRequest. Также вам не хватает в первой строке линии идентификации с jdweng

ответ

2

В вашем XML-файл корневой элемент пространства имен http://kmd.dk/fie/external_invoiceDistribution с префиксом ns1.

Элемент <CONTROL_FIELDS> не потому, что он не префикс. Однако ваш класс сериализации не учитывает это. Это означает, что он ожидает, что <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, как предполагалось.

В случае проблем с сериализацией я часто создаю классы в памяти, а затем сериализую их, чтобы я мог проверить полученный XML. Это часто дает подсказку о том, что отсутствует или добавляются по сравнению с входным документом:

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

А затем проверьте s различия.

+0

Собственно. Проблема была вне области действия - потому что перед десериализатором я не знал о методе RemoveNamespace. Но, конечно, когда пространство имен было разрешено, это сработало. Поэтому ваш ответ на самом деле помог мне в пути ... – baddaydaddy

+0

И если вы посмотрите на внутреннее исключение, это должно было привести меня к выводу, что пространство имен фактически было удалено. – baddaydaddy

0

Вы можете заменить '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; } 
} 
Смежные вопросы