Ошибка десериализации C # XML (2,2)

Школа дала мне XML-документ, и я должен отображать информацию на экране. Насколько я знаю, десериализация Xml была бы самым простым и приятным решением.

У меня пока есть это:

public static List<Project> ProjectListDeserialize(string path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<Project>));
    Stream filestream = new FileStream(path, FileMode.Open);
    return (List<Project>)serializer.Deserialize(filestream);
}

public static Projects ProjectsDeserialize(string path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Projects));
    Stream filestream = new FileStream(path, FileMode.Open);
    return (Projects)serializer.Deserialize(filestream);
}

А вот как выглядит XML-документ:

<?xml version="1.0" encoding="utf-16" ?>    
<Projects xmlns="http://www.pulse.nl/DynamicsAX/2009/DataSets" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Project ID ="1000.0001" CustomerID="1000">
        <Name>Project data key performance indicators</Name>
        <Status>WorkInProgress</Status>
        <StartDate>2011-01-01</StartDate>
        <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate>
        <CompletionDate xsi:nil="true" />
    </Project>
    <Project ID ="1000.0008" CustomerID="1000" ParentID="1000.0001">
        <Name>Implementation</Name>
        <Status>WaitListed</Status>
        <StartDate>2011-06-01</StartDate>
        <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate>
        <CompletionDate xsi:nil="true" />
    </Project>
</Projects>

Оба метода выдают одно и то же исключение:

<Projects xmlns='http://www.pulse.nl/DynamicsAX/2009/DataSets was not expected

Как я могу правильно десериализовать указанный выше xml? Любые образцы были бы полезны!


person Jordy Langen    schedule 20.04.2011    source источник
comment
вы определили пространства имен в определениях классов project / s?   -  person mmix    schedule 20.04.2011
comment
Вы должны удалить xmlns из элемента Projects. или напишите собственный сериализатор. или используйте инструмент xsd в .NET SDK для создания классов C #, совместимых с этим форматом Xml.   -  person Glenn Ferrie    schedule 14.01.2014


Ответы (2)


Попробуйте указать пространство имен по умолчанию для XML-документа в конструкторе XmlSerializer:

var serializer = new XmlSerializer(typeof(Projects), "http://www.pulse.nl/DynamicsAX/2009/DataSets");

Связанные ресурсы:

person Enrico Campidoglio    schedule 20.04.2011
comment
Мне удалось решить эту проблему, объединив оба предоставленных ответа, спасибо! - person Jordy Langen; 20.04.2011

Скорее всего, проблема в том, что вы не указали правильное пространство имен в качестве атрибута для своего класса Project.

Вы можете указать XmlSerializer игнорировать пространства имен во время десериализации (проверьте это ответ).

В качестве альтернативы вы можете установить соответствующее пространство имен с помощью XmlTypeAttribute:

[XmlType(Namespace = "http://www.pulse.nl/DynamicsAX/2009/DataSets")]
public class Project 
{
   ...
}
person Groo    schedule 20.04.2011
comment
Мне удалось решить эту проблему, объединив оба предоставленных ответа, спасибо! - person Jordy Langen; 20.04.2011