2009-01-21 10 views
2

J'ai un document XML d'une source externe.Comment désérialiser un document XML avec un espace de noms préfixé mais pas d'éléments avec préfixe ns?

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

J'ai besoin de le désérialiser en un objet comme celui-ci.

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

Utilisé comme est, le Serializer jette un InvalidOperationException

<Info xmlns='http://www.ZomboCorp.com/'> n'a pas été prévu.

Si j'ajoute [XmlElement(Namespace = "http://www.ZomboCorp.com/")] à la définition de la classe, le Serializer retourne un nouvel objet Info propriétés null.

Répondre

5

J'ai utilisé xsd.exe (un outil VS) et généré un schéma à partir du fichier XML, puis un fichier de classe à partir du schéma. Il a suggéré

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

Mais, j'ai pu sortir avec

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

Qu'en est-il de l'exécution ?, est-ce possible? – neslekkiM

5

Vous devez également ajouter l'attribut XmlElement à chaque propriété, en définissant la propriété Namespace sur une chaîne vide (car l'espace de noms n'est pas hérité dans votre situation).

Votre définition pour plus d'informations devrait ressembler à ceci:

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

Ensuite, il désérialiser correctement.

+0

@ajmastrean: Regardez nouvelle réponse, je courais avec votre XML et cela a fonctionné avec les propriétés renseignées correctement. – casperOne

+0

Merci d'avoir fait de votre mieux pour exécuter du code. Je vais +1 votre réponse pour cela :) –

Questions connexes