2010-09-09 162 views
4

我有一个XML文件,其中有一个注释掉的节点。我使用语法创建了此节点 -使用C#取消注释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> --> 

回答

7

据我所知,使用XmlDocument的,有做这个没有直接的方法。您将需要做类似下面的

  1. 获取注释节点的值
  2. 创建与步骤1
  3. 值新的XMLNode删除注释节点
  4. 从添加新节点步骤2到DOM树

下面是一个示例,其中简化了您的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); 
    } 
+0

我该如何得到这个特殊的评论节点。 (可能有几个注释节点)。有没有办法为此使用XQuery? – Ananth 2010-09-09 14:13:43

+0

@Anath,我猜最好的选择是使用XPath查询XmlDocument.SelectNodes()来获取注释,然后使用string.IndexOf或者如果模式更复杂,检查您感兴趣的模式的字符串可以使用RegEx。 – 2010-09-09 14:18:13

+0

@Anath,我在上面添加了一个示例来解决您的评论。这有帮助吗? – 2010-09-10 08:19:44