Чтобы раскомментировать закомментированный узел в файле XML с помощью C#

У меня есть файл 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>

person Ananth    schedule 09.09.2010    source источник


Ответы (1)


Насколько мне известно, с помощью XmlDocument нет прямого способа сделать это. Вам нужно будет сделать что-то вроде следующего

  1. Получить значение узла комментария
  2. Создайте новый XmlNode со значением из шага 1.
  3. Удалить узел комментария
  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);
  }
person Chris Taylor    schedule 09.09.2010
comment
как мне получить этот конкретный прокомментированный узел. (Может быть несколько закомментированных узлов). Есть ли способ использовать XQuery для этого? - person Ananth; 09.09.2010
comment
@Anath, я думаю, лучшим вариантом было бы использовать XPath-запрос XmlDocument.SelectNodes(), чтобы получить комментарии, а затем проверить строку на наличие интересующего вас шаблона, используя либо string.IndexOf, либо, если шаблон более сложный, вы можете используйте регулярное выражение. - person Chris Taylor; 09.09.2010
comment
@Anath, я добавил пример, чтобы ответить на ваш комментарий выше. Это помогает? - person Chris Taylor; 10.09.2010
comment
Он добавляет xmlns= в node. Как я могу добавить ссылку на пространство имен в код, чтобы атрибут не добавлялся? - person Sunil Agarwal; 05.06.2013