Como desserializar um documento XML com um namespace prefixado, mas há elementos ns-prefixados?
-
19-08-2019 - |
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.
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.