11
votes

Décodez la section CDATA en C #

J'ai un peu de XML comme suit:

This is a "description" that I have formatted.


0 commentaires

5 Réponses :


18
votes

Vous pouvez utiliser LINQ pour lire CDATA.

     string xml = @"<section>
                      <description>
                        <![CDATA[
                          This is a ""description""
                          that I have formatted
                        ]]>
                      </description>
                    </section>";

        XPathDocument xDoc = new XPathDocument(new StringReader(xml.Trim()));
        XPathNavigator nav = xDoc.CreateNavigator();
        XPathNavigator descriptionNode = 
            nav.SelectSingleNode("/section/description");

        string desiredValue = 
            Regex.Replace(descriptionNode.Value
                                     .Replace(Environment.NewLine, String.Empty)
                                     .Trim(),
                @"\s+", " ");


4 commentaires

Merci, mais j'aurais dû être plus précis que je le fais dans 2,0 sur le cadre compact. Je pourrais envisager de voir si cela serait plus avantageux de passer à 3,5 à l'avenir.


J'ai édité avec une autre idée. Je n'ai pas .net 2.0 cf installé cependant, donc je ne suis pas sûr que c'est compatible.


@JIM SCHUBERT Voulez-vous inclure des parenthèses après "descendantNodes", par exemple: "xdoc.descendantNodes (). Detype (). Compte ();"?


@Anthony: Bien sûr, monsieur! Merci de le pointer. J'ai mis à jour la réponse avec la correction!



3
votes

Les blocs de CDATA sont effectivement verbatim. Tout blancheur à l'intérieur de CDATA est significatif, par définition, selon la spécification XML. Par conséquent, vous obtenez ce blanc lorsque vous récupérez la valeur du nœud. Si vous souhaitez le dépouiller à l'aide de vos propres règles (puisque XML Spec ne spécifie aucune façon standard de stripping Whitpace dans CDATA), vous devez le faire vous-même, en utilisant string.replace , , Regex.replace etc. au besoin.


0 commentaires

9
votes

En fait, je pense que c'est très simple. La section CDATA code> Il sera chargé dans le xmldocument code> comme un autre xmlnode code> la différence est que ce nœud va avoir la propriété Nadetype = CDATA, Qui signifie si vous avez le xmlnode nœud = doc.selectSingLenode ("section / description"); code> que le nœud aura un enfantNode code> avec le innertext code > La propriété a rempli les données pures et vous souhaitez supprimer les caractères spéciaux d'utiliser simplement couper () code> et vous aurez les données.

Le code ressemblera à p>

XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();


0 commentaires

11
votes

Je pense que le meilleur moyen est de ...

XmlCDataSection cDataNode = (XmlCDataSection)(doc.SelectSingleNode("section/description").ChildNodes[0]);

string finalData = cDataNode.Data;


1 commentaires

Certainement la meilleure solution, courte, pas de conversions de chaîne impliquées et utilisant les méthodes existantes System.xML.



4
votes

une forme plus simple de @ Solution de Franky : xxx

le Valeur Propriété est équivalent à la propriété DATA de la zone CASTED XMLCDatasection TYPE.


1 commentaires

La valeur est bien ici aussi;