2010-05-07 5 views
1

Compte tenu de cet extrait XML:Comment désérialiser un élément namespaced à un objet dans .net?

... 
<InSide:setHierarchyUpdates> 
    <automaticUpdateInterval>5</automaticUpdateInterval> 
    <shouldRunAutomaticUpdates>true<shouldRunAutomaticUpdates> 
</InSide:setHierarchyUpdates> 
... 

Je cherche à sérialiser cet objet:

Imports System.Xml.Serialization 
<XmlRoot(ElementName:="setHierarchyUpdates", namespace:="InSide")> _ 
Public Class HierarchyUpdate 
    <XmlElement(ElementName:="shouldRunAutomaticUpdates")> _ 
    Public shouldRunAutomaticUpdates As Boolean 
    <XmlElement(ElementName:="automaticUpdateInterval")> _ 
     Public automaticUpdateInterval As Integer 
End Class 

Comme ceci:

Dim hierarchyUpdater As New HierarchyUpdate 
Dim x As New XmlSerializer(hierarchyUpdater.GetType) 
Dim objReader As Xml.XmlNodeReader = New Xml.XmlNodeReader(myXMLNode) 
hierarchyUpdater = x.Deserialize(objReader) 

Cependant, l'objet, après la désérialisation, a des valeurs de faux et zéro. Si je passe le objReader à un StreamReader et lu dans un fichier, avec aucun de ses parents et sans espaces de noms, cela fonctionne:

<setHierarchyUpdates> 
    <automaticUpdateInterval>5</automaticUpdateInterval> 
    <shouldRunAutomaticUpdates>true<shouldRunAutomaticUpdates> 
</setHierarchyUpdates> 

Qu'est-ce que je fais mal? Dois-je utiliser autre chose que XMLRoot dans la définition de classe, car, en tant que nœud XML, ce n'est pas vraiment la racine? Si oui, quoi? Pourquoi aucune erreur n'est renvoyée lorsque cela échoue?

Répondre

2

Il suffit de spécifier simplement l'espace de noms par défaut à utiliser dans votre appel au constructeur XmlSerializer:

Dim hierarchyUpdater As New HierarchyUpdate 
Dim x As New XmlSerializer(hierarchyUpdater.GetType, "http://yournamespace.org") 
Dim objReader As Xml.XmlNodeReader = New Xml.XmlNodeReader(myXMLNode) 
hierarchyUpdater = x.Deserialize(objReader) 

Note: la InSide que vous utilisez est le plus probablement le préfixe d'espace de noms XML - pas l'espace de noms XML réel. Quelque part dans votre document XML, vous devriez voir une définition quelque chose comme:

xmlns:InSide="http://yournamespace.org" 

(ou quelque chose de similaire) - vous devez utiliser l'espace de noms réelle - pas le préfixe - dans l'appel constructeur XmlSerializer

+0

Nous vous remercions de la note sur le préfixe d'espace de nommage. Cependant, même lorsque j'ajoute l'espace de noms au constructeur (en vérifiant qu'il ne s'agit pas seulement du préfixe), il ne désérialise toujours pas correctement. Je ne pense pas que cela changerait les choses, mais l'élément parent (au-dessus de shouldRunAutomaticUpdates) a plusieurs espaces de noms définis, dont l'un est 'InSide'. – pc1oad1etter

Questions connexes