2010-09-09 3 views
4

У меня есть XML-файл с узлом, который закомментирован. Я создал этот узел с использованием синтаксиса -Чтобы раскомментировать комментарий в XML-файле, используя C#

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. Создать новую 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); 
    } 
+0

как я могу получить этот конкретный узел с комментариями. (Может быть несколько комментариев узлов). Есть ли способ использовать XQuery для этого? – Ananth

+0

@Anath, я думаю, лучшим вариантом было бы использовать XPath-запрос XmlDocument.SelectNodes(), чтобы получить комментарии, а затем проверить строку для интересующего вас шаблона, используя либо string.IndexOf, либо если шаблон более сложный, вы может использовать RegEx. –

+0

@ Анат, я добавил пример, чтобы ответить на ваш комментарий выше. Помогает ли это? –