2011-02-16 3 views
0

J'utilise XmlSerializer pour désérialiser un fichier de configuration. Je veux être en mesure de récupérer le contenu enfant d'un élément Xml dans un champ de chaîne. Ce contenu enfant peut être xml lui-même.Comment désérialiser le contenu Xml en chaîne

Un exemple simple:

public class Configuration 
{ 
    [XmlAttribute] 
    public string MyAttribute { get; set; } 

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

Je suis en train d'analyser les éléments suivants:

<Configuration MyAttribute="foo"> 
    <SomeOtherXml /> 
</Configuration> 

Je veux la propriété de contenu à régler à "<SomeOtherXml />" mais je ne peux pas sembler obtenir ce travail. Je ne veux pas encapsuler le contenu dans un CDATA ou similaire. Est-ce possible ou dois-je gérer manuellement l'analyse de mon fichier de configuration?

Merci

+0

Vous pourriez utiliser un Regex pour l'analyser, mais je suppose que vous le saviez déjà. –

+0

@Duncan - Pourquoi vous souciez-vous de l'appel de l'élément xml? Vous pouvez simplement nommer la propriété Content à "SomeOtherXml" si vous le souhaitez. –

+0

@Ramhound - Je me fiche de l'appel de l'élément Xml - Je veux que la ** valeur ** de la propriété Content soit '" "'. –

Répondre

1

Il est possible d'utiliser XmlSerializer mais ne nécessite l'analyse manuelle de sorte qu'il ne peut pas être la peine à la fin.

Il existe peut-être d'autres méthodes, mais la méthode que j'ai trouvée pour cela consiste à implémenter l'interface IXmlSerializable dans votre classe de configuration.

public class Configuration : IXmlSerializable 
{ 
    [XmlAttribute] 
    public string MyAttribute { get; set; } 

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

    public void ReadXml(XmlReader reader) 
    { 
     if(reader.NodeType == XmlNodeType.Element && 
      string.Equals("Configuration", reader.Name, StringComparison.OrdinalIgnoreCase)) 
     { 
      MyAttribute = reader["MyAttribute"]; 
     } 

     if(reader.Read() && 
      reader.NodeType == XmlNodeType.Element && 
      string.Equals("SomeOtherXml", reader.Name, StringComparison.OrdinalIgnoreCase)) 
     { 
      Content = reader.ReadOUterXml(); //Content = "<SomeOtherXml />" 
     } 
    } 

    public void WriteXml(XmlWriter writer) { } 
    public XmlSchema GetSchema() { } 
} 

Espérons que cela aide.

Questions connexes