EM_Y Ответов: 2

Раскомментируйте XML-узел с помощью WPF/C#


это мой xml файл :

<?xml version="1.0" encoding="utf-8"?>

<Sequence>
  <Inputs>

<!--<Input>readOF</Input> -->
    <Input>readReference</Input>
   
  </Inputs>
 </Step>-->

  </Steps></Sequence>



Я хочу раскомментировать эту строку :
<!--<Input>readOF</Input> -->


Желаемый результат:
<Input>readOF</Input>


Что я уже пробовал:

это мой код, когда я пытался прокомментировать xml-узел :

var document = new XmlDocument();
document.LoadXml(text);
XmlNodeList nodes = document.SelectNodes("/Sequence/Inputs/Input[.='readOF']");
foreach (XmlNode node in nodes)
  node.ParentNode.ReplaceChild(document.CreateComment(node.OuterXml), node);


Это прекрасно работает .
Но теперь я хочу обратного : раскомментируйте этот конкретный узел xml .
Спасибо Вам за любую помощь :)

2 Ответов

Рейтинг:
17

Leo Chapiro

Посмотри: Раскомментировать закомментированное узла в XML-файл с помощью C# ответили: Крис Тейлор



Насколько мне известно, с помощью 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);
}


EM_Y

Спасибо Вам за вашу помощь и время ^^ это работа по ловле первого узла со значением, которое я хочу .
Я хочу раскомментировать каждый узел с этим значением ,
например :

  <Inputs>

<!--<Input>readOF</Input> -->
<!--<Input>readOF</Input> -->
    <Input>readReference</Input>
   
  </Inputs>


Желаемый результат:
<Input>readOF</Input>
<Input>readOF</Input>


Не могли бы вы помочь мне с этим плз ^^

Рейтинг:
10

Eric Lynch

Похоже, вы пытаетесь изменить то, что вы сделали в предыдущем вопросе. Если да, то я бы сделал что-то вроде следующего:

XmlNodeList nodes = document2.SelectNodes("/Sequence/Inputs/comment()[starts-with(., '<Input>')]");
foreach (XmlNode node in nodes)
{
  XmlDocumentFragment fragment = document2.CreateDocumentFragment();
  fragment.InnerXml = node.Value;

  var element = fragment.FirstChild as XmlElement;
  if (element.FirstChild.Value == "readOF")
    node.ParentNode.ReplaceChild(element, node);
}

Для справки (для других) предварительный вопрос можно найти по адресу:

Прокомментируйте конкретный входной код XML-файла , используя WPF .[^]

Некоторые другие ссылки для проверки:

синтаксис XPath[^]

Основные запросы (LINQ to XML) (C#) | Microsoft Docs[^]


EM_Y

Ты не перестаешь мне помогать ^^ ,
Я ценю вашу помощь и время , я новичок в xml , я пытаюсь получить и сделать лучше .
Спасибо за ваше внимание .

Eric Lynch

Никаких проблем, с удовольствием помогу.

Я предлагаю потратить некоторое время на ознакомление с синтаксисом XPATH. Он довольно мощный (и не очень сложный в освоении).

Если вы будете играть с XML в долгосрочной перспективе, я бы предложил проверить новые API LINQ to XML (XDocument). Я нахожу их более простыми в использовании, чем оригинальный API (XmlDocument).

Я обновил решение, включив ссылки для обоих вариантов.

Этот сайт (CodeProject) содержит множество вводных статей о самом LINQ. Даже если вы не планируете много играть с XML, LINQ стоит вашего времени. Это полезно почти в любое время, когда вы манипулируете коллекциями предметов.

EM_Y

Я постараюсь проверить и узнать матч, который смогу ^^ .
Спасибо.