Как я могу десериализовать XML с пространством имен по умолчанию? - PullRequest
6 голосов
/ 05 августа 2009

Я пытаюсь десериализовать Atom xml, сгенерированный одной из внутренних систем. Тем не менее, когда я пытаюсь:

    public static MyType FromXml(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyType ));
        return (MyType) serializer.Deserialize(new StringReader(xml));
    }

выдает исключение при определении пространства имен:

System.InvalidOperationException: <feed xmlns='http://www.w3.org/2005/Atom'> was not expected.

Когда я добавляю пространство имен в конструктор XmlSerializer, мой объект полностью становится пустым:

    public static MyType FromXml(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(MyType ), "http://www.w3.org/2005/Atom");
        return (MyType) serializer.Deserialize(new StringReader(xml)); //this will return an empty object
    }

Есть идеи, как мне заставить его работать?

Ответы [ 2 ]

10 голосов
/ 05 августа 2009

Трудно исследовать это, не имея возможности взглянуть на то, как ваша объектная модель связана с xml (то есть, образцы каждого); тем не менее, вы должны быть в состоянии сделать что-то вроде:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")]
public class MyType {...}

В качестве примера с ограниченным атомом (который отлично работает с некоторым атомом образца, который у меня есть "в руки"):

class Program
{
    static void Main()
    {
        string xml = File.ReadAllText("feed.xml");
        XmlSerializer serializer = new XmlSerializer(typeof(MyType));
        var obj = (MyType)serializer.Deserialize(new StringReader(xml));
    }
}
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")]
public class MyType
{
    [XmlElement("id")]
    public string Id { get; set; }
    [XmlElement("updated")]
    public DateTime Updated { get; set; }
    [XmlElement("title")]
    public string Title { get; set; }
}
5 голосов
/ 05 августа 2009

Вы можете отладить сериализацию XML, добавив это в app.config

<system.diagnostics>
  <switches>
    <add name="XmlSerialization.Compilation" value="1" />
  </switches>
</system.diagnostics>

В вашей временной папке создаются файлы C # для сериализатора, и вы можете открыть их в VS для отладки.

Также взгляните на XmlNamespaceManager (даже для пространств имен по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...