使用C#取消注释XML文件中的注释节点

时间:2010-09-09 13:32:34

标签: c# xml xmldom

我有一个XML文件,其中有一个被注释掉的节点。我使用语法

创建了这个节点

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

取消注释此节点的最佳方法是什么?我可以根据用于创建节点的名称(RELTABLECOMMENTED)来识别此节点吗?

这是注释节点

 
<!--<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> -->

1 个答案:

答案 0 :(得分:9)

据我所知,使用XmlDocument,没有直接的方法可以做到这一点。您需要执行以下操作

  1. 获取评论节点的值
  2. 使用步骤1中的值
  3. 创建一个新的XmlNode
  4. 删除评论节点
  5. 将步骤2中的新节点添加到DOM树
  6. 以下是一个示例,其中包含XML的略微简化版本,并在有关查找正确注释节点的注释中解决您的问题。请注意,我查询所有注释节点,显然您可以更具体,并查询您感兴趣的文档部分。

      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);
      }