【问题标题】:To uncomment a commented node in a XML file using C#使用 C# 取消注释 XML 文件中的注释节点
【发布时间】:2010-09-09 13:32:33
【问题描述】:

我有一个 XML 文件,其中有一个被注释掉的节点。我使用以下语法创建了这个节点:

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

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

这是注释节点:

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

【问题讨论】:

    标签: c# xml xmldom


    【解决方案1】:

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

    1. 获取评论节点的值
    2. 使用步骤 1 中的值创建一个新的 XmlNode
    3. 删除评论节点
    4. 将步骤 2 中的新节点添加到 DOM 树中

    这是一个示例,其中包含稍微简化的 XML 版本,并解决了您在 cmets 中查找正确评论节点的问题。请注意,我查询的是所有评论节点,显然您可以更具体地查询您感兴趣的文档部分。

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

    【讨论】:

    • 我如何获得这个特殊的注释节点。 (可能有几个注释节点)。有没有办法为此使用 XQuery?
    • @Anath,我想最好的选择是使用 XPath 查询 XmlDocument.SelectNodes() 来获取 cmets,然后使用 string.IndexOf 或检查您感兴趣的模式的字符串如果模式更复杂,您可以使用正则表达式。
    • @Anath,我添加了一个示例来解决您上面的评论。这有帮助吗?
    • 它在节点中添加了 xmlns=""如何在代码中添加命名空间引用以使属性不附加?
    猜你喜欢
    • 2012-12-08
    • 2020-09-27
    • 2015-09-19
    • 1970-01-01
    • 2016-12-10
    • 2022-01-20
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多