Как десериализовать документ XML с префиксным пространством имен, но без элементов с префиксом ns? - PullRequest
2 голосов
/ 21 января 2009

У меня есть документ XML из внешнего источника.

<?xml version="1.0" encoding="utf-8"?>
<ns0:Info xmlns:ns0="http://www.ZomboCorp.com/">
  <Name>Anthony</Name>
  <Job>Developer</Job>
</ns0:Info>

Мне нужно десериализовать его в подобный объект.

public class Info
{
    public String Name { get; set; }
    public String Job { get; set; }
}

Используется как есть, Serializer бросает InvalidOperationException

<Info xmlns='http://www.ZomboCorp.com/'> не ожидалось.

Если я добавлю [XmlElement(Namespace = "http://www.ZomboCorp.com/")] в определение класса, Serializer вернет новый объект Info с нулевыми свойствами.

Ответы [ 2 ]

6 голосов
/ 21 января 2009

Вы также должны добавить атрибут XmlElement к каждому свойству, задав для свойства Namespace пустую строку (так как пространство имен не наследуется в вашей ситуации).

Ваше определение для Info должно выглядеть так:

XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
    [XmlElement(Namespace = "")]
    public String Name { get; set; }
    [XmlElement(Namespace = "")]
    public String Job { get; set; }
}

Тогда он будет десериализован правильно.

5 голосов
/ 22 января 2009

Я использовал xsd.exe (средство VS) и сгенерировал схему из файла XML, а затем файл класса из схемы. Он предложил

[XmlType(AnonymousType = true, Namespace = "http://www.ZomboCorp.com/")]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/", IsNullable = false)]
public class Info
{
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Name { get; set; }
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Job { get; set; }
}

Но мне удалось сойти с рук

[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
public class Info
{
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Name { get; set; }
    [XmlElement(Form = XmlSchemaForm.Unqualified)]
    public String Job { get; set; }
}
...