2010-09-09 5 views
4

J'ai un fichier XML dont un noeud est mis en commentaire. J'ai créé ce noeud en utilisant la syntaxe -Pour décommenter un noeud commenté dans un fichier XML à l'aide de C#

relTableCommentedNode = xDoc.CreateNode (XmlNodeType.Comment, "RELTABLECOMMENTED", "np");

Quelle est la meilleure approche pour décommenter ce noeud? Puis-je identifier ce noeud en fonction du nom que j'ai utilisé pour créer le noeud (RELTABLECOMMENTED)?

Ce noeud a commenté

 
<!--<reltable toc="no" class="- map/reltable "> 
    <relheader class="- map/relheader "> 
     <relcolspec type="concept" class="- map/relcolspec ">  
    </relheader> 
    <relrow class="- map/relrow "> 
     <relcell class="- map/relcell "> 
     <topicref href="concepts\about_cannedgoods.dita" copy-to="concepts\about_cannedgoods.dita" class="- map/topicref " xmlns:dctm="http://www.documentum.com"> 
     </topicref> 
     </relcell>  
    </relrow> 
    </reltable> --> 

Répondre

7

Au meilleur de ma connaissance, en utilisant XmlDocument, il n'y a aucun moyen direct de le faire. Vous aurez besoin de faire quelque chose comme le

suivant
  1. Obtenir la valeur du nœud de commentaire
  2. Créer une nouvelle XmlNode avec la valeur de l'étape 1
  3. Supprimer le nœud de commentaire
  4. Ajouter le nouveau nœud de étape 2 de l'arborescence DOM

Voici un exemple avec une version légèrement simplifiée de votre XML et adressant votre question dans les commentaires sur la recherche du bon nœud de commentaire. Notez que je demande pour tous les nœuds de commentaire, évidemment vous pouvez être plus spécifique et interroger la partie du document qui vous intéresse.

string xml = @" 
    <root> 
     <!--<reltable toc='no' class='- map/reltable '> 
     <relheader class='- map/relheader '> 
     <relcolspec type='concept' class='- map/relcolspec '/>  
     </relheader>   
    </reltable> --> 

    <!--<reltable toc='no' class='- map '> 
     <relheader class='- map/relheader '> 
     <relcolspec type='concept' class='- map/relcolspec '/>  
     </relheader>   
    </reltable> --> 
    </root>"; 

    XmlDocument xdoc = new XmlDocument(); 
    xdoc.LoadXml(xml); 

    XmlNodeList commentedNodes = xdoc.SelectNodes("//comment()"); 
    var commentNode = (from comment in commentedNodes.Cast<XmlNode>() 
       where comment.Value.Contains("class='- map '") 
       select comment).FirstOrDefault(); 

    if (commentNode != null) 
    { 
    XmlReader nodeReader = XmlReader.Create(new StringReader(commentNode.Value)); 
    XmlNode newNode = xdoc.ReadNode(nodeReader); 
    commentNode.ParentNode.ReplaceChild(newNode, commentNode); 
    } 
+0

Comment puis-je obtenir ce nœud commenté particulier. (Il pourrait y avoir plusieurs nœuds commentés). Est-il possible d'utiliser XQuery pour cela? – Ananth

+0

@Anath, je suppose que la meilleure option serait d'utiliser XPath requête XmlDocument.SelectNodes() pour obtenir les commentaires et ensuite vérifier la chaîne pour le modèle qui vous intéresse, en utilisant soit string.IndexOf ou si le modèle est plus complexe vous peut utiliser un RegEx. –

+0

@Anath, j'ai ajouté un exemple pour répondre à votre commentaire ci-dessus. est-ce que cela aide? –