«Неизвестный узел: VarName» во время десериализации XML - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть этот пример XML-файла, который мне нужно десериализовать:

<?xml version="1.0" encoding="utf-8"?>
<CollectionOfUnits>
    <Unit>
        <StringVar>TohleJeString</StringVar>
        <Int32Var>24</Int32Var>
        <DoubleVar>29.6</DoubleVar>
        <DateTimeVar>17.11.1968</DateTimeVar>
        <CharVar>c</CharVar>
    </Unit>
    <Unit>
        <StringVar>TohleJeTakéString</StringVar>
        <Int32Var>17</Int32Var>
        <DoubleVar>5.9</DoubleVar>
        <DateTimeVar>06.07.1415</DateTimeVar>
        <CharVar>p</CharVar>
    </Unit>
    <Unit>
        <StringVar>NoATohleTaké</StringVar>
        <Int32Var>2</Int32Var>
        <DoubleVar>78.5</DoubleVar>
        <DateTimeVar>06.12.1774</DateTimeVar>
        <CharVar>x</CharVar>
    </Unit>
</CollectionOfUnits>

Вот корневой класс со списком другого класса:

[XmlRoot("CollectionOfUnits", IsNullable = false)]
public class XmlExampleCollectionOfUnits
{
    [XmlArray("Unit")]
    public List<XmlExampleBasicUnit> Units { get; set; }
    public XmlExampleCollectionOfUnits(List<XmlExampleBasicUnit> units)
    {
        Units = units;
    }
    public XmlExampleCollectionOfUnits()
    {
    }
}

Структура классавыше:

public class XmlExampleBasicUnit
{
    public String StringVar { get; set; }
    public Int32 Int32Var { get; set; }
    public Double DoubleVar { get; set; }
    public DateTime DateTimeVar { get; set; }
    public Char CharVar { get; set; }
}

Я использую эти функции из документации XmlSerializer, которые полезны во время отладки (отсюда вызывается вывод):

private void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
    Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
}

private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
    XmlAttribute attr = e.Attr;
    Console.WriteLine("Unknown attribute " + attr.Name + "='" + attr.Value + "'");
}

А вот вывод:

Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar    
Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar    
Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar

Я думаю, что структура закодирована правильно.Я пропускаю какое-то обозначение?

1 Ответ

0 голосов
/ 17 декабря 2018

Здесь есть 3 проблемы:

  • вы хотите XmlElementAttribute, а не XmlArrayAttribute, так как у вас есть только одноуровневое вложение, поэтому: [XmlElement("Unit")]
  • Ваши даты не действительны как даты в формате XML;либо отформатируйте их соответствующим образом ( ISO 8601 , т.е.: 1968-11-17 и т. д.), либо используйте string вместо DateTime и впоследствии преобразовайте его вручную
  • тип char isn 't подходит - это, по сути, целочисленный тип;используйте string вместо

С этими изменениями: оно должно работать.

...