2015-11-16 1 views
1

Lorsque je désérialise une chaîne XML, je dois enregistrer un fichier XML externe XElement sur une propriété de chaîne appelée prop2.XML - Désérialise la propriété en tant que sous-arbre Xml

Mon XML:

<MyObj> 
    <prop1>something</prop1> 
    <prop2> 
    <RSAKeyValue> 
     <Modulus>...</Modulus> 
     <Exponent>...</Exponent> 
    </RSAKeyValue> 
    </prop2> 
    <prop3></prop3> 
</MyObj> 

Mon objet:

public class MyObj 
{ 
    [XmlElement("prop1")] 
    public string prop1 { get; set; } 

    [XmlText] 
    public string prop2 { get; set; } 

    [XmlElement(ElementName = "prop3", IsNullable = true)] 
    public string prop3 { get; set; } 
} 

Je désérialisation en utilisant XmlSerializer, comme ceci:

var serializer = new XmlSerializer(typeof(T)); 
return (T)serializer.Deserialize(new StringReader(myXmlString)); 

J'ai essayé d'utiliser [XmlText] pour enregistrer le texte XML dans prop2 Mais je reçois seulement null.

Que dois-je faire pour enregistrer <RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent></RSAKeyValue> comme du texte dans prop2?

+0

Copie possible de [Comment désérialiser un document XML] (http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) – MethodMan

+0

@MethodMan Je ne vois pas où se trouve la duplication. .. Dans cette question, ils doivent désérialiser chaque élément xml à une propriété, mais j'ai besoin de désérialiser tous les xml externe RSAKeyValue à une seule propriété comme chaîne de texte – Ninita

+0

@MethodMan croyez-moi que je l'ai déjà fait depuis ce matin. Mais ma question est un problème particulier. – Ninita

Répondre

3

XmlText valorisera au format XML codé sous forme de texte ("&gt;prop2&lt;...") voir XmlTextAttribute

Par défaut, le XmlSerializer sérialise un membre de classe comme un élément XML. Toutefois, si vous appliquez XmlTextAttribute à un membre, XmlSerializer traduit sa valeur en texte XML. Cela signifie que la valeur est codée dans le contenu d'un élément XML.

Une solution possible - utiliser XmlNode comme type de la propriété:

public class MyObj 
{ 
    [XmlElement("prop1")] 
    public string prop1 { get; set; } 

    public XmlNode prop2 { get; set; } 

    [XmlElement(ElementName = "prop3", IsNullable = true)] 
    public string prop3 { get; set; } 
} 

var r = (MyObj)serializer.Deserialize(new StringReader(myXmlString)); 
Console.WriteLine(r.prop2.OuterXml); 

Sinon, vous pouvez faire l'objet tout mettre en œuvre sérialisation XML personnalisé ou avoir le type personnalisé qui correspond à XML (lire normalement) et ont plus propriété pour représenter cet objet en tant que chaîne XML.

+1

Je pense qu'il voudrait le OutterXml plutôt que le InnerXml: intérieur: ... ... extérieur: ... ... merthsoft

+0

qui semble bon mais ceci toujours en réglant 'prop2' à' null' – Ninita

+0

Et si j'utilise 'public XmlNode prop2 {get; ensemble; } 'J'obtiens l'exception' Il y avait une erreur reflétant la propriété 'prop2'' – Ninita