Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

To uncomment a commented node in a XML file using C#

Tags:

c#

xml

xmldom

I have a XML file which has a node which is commented out. I have created this node using the syntax:

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

What is the best approach to uncomment this node? Can I identify this node based on the name which I used to create the node (RELTABLECOMMENTED)?

This the commented node:

<code>
<pre> 
<!--<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> -->
</pre>
</code>
like image 867
Ananth Avatar asked Sep 09 '10 13:09

Ananth


People also ask

How to comment the XML file?

An XML comment encountered outside the document type declaration is represented by the Comment value syntax element. It contains the comment text from the XML message. If the value of the element contains the character sequence --> , the sequence is replaced with the text --&gt; .

How do I comment out a line in XML?

The syntax for adding XML comments in your code is triple slashes /// followed by one of the supported XML tags.


1 Answers

To the best of my knowledge, using XmlDocument, there is no direct way to do this. You will need to do something like the following

  1. Get the value of the comment node
  2. Create a new XmlNode with the value from step 1
  3. Delete the comment node
  4. Add the new node from step 2 to the DOM tree

Here is an example with a slightly simplified version of your XML and addressing your quesion in the comments on finding the correct comment node. Note that I query for all comment nodes, obviously you can be more specific and query the portion of the document that you are interested in.

  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);
  }
like image 95
Chris Taylor Avatar answered Sep 19 '22 23:09

Chris Taylor