Como desserializar um documento XML com um namespace prefixado, mas há elementos ns-prefixados?

StackOverflow https://stackoverflow.com/questions/465825

Pergunta

Eu tenho um documento XML a partir de uma fonte externa.

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

Eu preciso para desserializar-lo em um objeto como este.

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

Usado como é, o Serializer lança uma InvalidOperationException

<Info xmlns='http://www.ZomboCorp.com/'> não era esperado.

Se eu adicionar [XmlElement(Namespace = "http://www.ZomboCorp.com/")] à definição de classe, o Serializer retorna um novo objeto Info com propriedades nulos.

Foi útil?

Solução 2

xsd.exe (a ferramenta VS) e gerou um esquema a partir do arquivo XML e, em seguida, um arquivo de classe do esquema. Ele sugeriu

[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; }
}

Mas, eu era capaz de fugir com

[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; }
}

Outras dicas

Você tem que adicionar o atributo XmlElement para cada propriedade, bem como, definindo a propriedade Namespace para uma cadeia vazia (como o namespace não é herdada em sua situação).

Sua definição para Informação deve ficar assim:

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

Em seguida, ele irá desserializar corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top