EM_Y Ответов: 3

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


this is my  xml file  :

<?xml version="1.0" encoding="utf-8"?>
<Sequence>
 <Inputs>
    <Input>readOF</Input>
    <Input>readReference</Input>
  </Inputs>
   </Steps>
</Sequence>



Я хочу прокомментировать эту строку xmlfile
<Input>readOF</Input>
использование wpf/c# программно
Мой код работает только тогда, когда у меня есть только один вход :

System.Xml.XmlNode elementToComment = xmlDocument.SelectSingleNode("/Sequence/Inputs/Input");


но когда у меня есть более одного входа ничего не работает ,

Я попытался определить свое значение элемента readOF но не смог найти правильный формат кода :

System.Xml.XmlNode elementToComment = xmlDocument.SelectSingleNode("/Sequence/Inputs/Input/readOF");


Желаемый результат:

<!--<Input>readOF</Input>-->


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

Мой WPF-код :
// Find the proper path to the XML file
              String xmlFilePath = "path\\xmfile.xml";

               // Create an XmlDocument
               System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();

               // Load the XML file in to the document
               xmlDocument.Load(xmlFilePath);

               // Get the target node using XPath
               System.Xml.XmlNode elementToComment = xmlDocument.SelectSingleNode("/Sequence/Inputs/Input");

               // Get the XML content of the target node
               String commentContents = elementToComment.OuterXml;

               // Create a new comment node
               // Its contents are the XML content of target node
               System.Xml.XmlComment commentNode = xmlDocument.CreateComment(commentContents);

               // Get a reference to the parent of the target node
               System.Xml.XmlNode parentNode = elementToComment.ParentNode;

               // Replace the target node with the comment
               parentNode.ReplaceChild(commentNode, elementToComment);

               xmlDocument.Save(xmlFilePath);
               MessageBox.Show("ok");



Как я могу определить входное значение моего элемента в моем коде?
Я хотел бы , чтобы это было ясно для вас, ожидая любой помощи .

Richard MacCutchan

В чем же вопрос?

EM_Y

Я хочу, чтобы закомментировать и раскомментировать код конкретного XML-файла или строки из WPF-приложения, используя кнопку действия

Richard MacCutchan

Да, вы уже сказали это в своем первоначальном посте. Итак, в чем же ваша настоящая проблема?

EM_Y

здесь я нашел какое-то решение , я обновил свою проблему , пожалуйста , проверьте ее, я буду признателен за любую помощь .

Eric Lynch

Во-первых, XML-файл в вашем вопросе недопустим. У него есть закрывающий тег для элемента Steps, но нет открывающего тега.

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

Наконец, вы можете рассмотреть возможность использования LINQ to XML вместо этого. Лично я нахожу этот интерфейс немного более дружелюбным в использовании. Вот ссылка:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-programming-overview

EM_Y

Я хочу прокомментировать эту строку readOF с помощью wpf/c# программно
Мой код работает только тогда, когда у меня есть только один вход, но когда у меня есть более одного, ничего не работает ,
Я попытался определить свое значение элемента readOF, но не смог найти правильный формат кода .

Я хотел бы , чтобы это было ясно для вас, Спасибо за ваше внимание .

Richard MacCutchan

Я не являюсь экспертом в XML, но, глядя на ваш код, я бы предположил, что вам нужно написать какой-то цикл. Вам нужно пройти через все узлы под названием Inputs и все их подузлы под названием Input проверка значения, которое вы хотите закомментировать.

3 Ответов

Рейтинг:
8

EM_Y

System.Xml.XmlNode inputs = xmlDocument.SelectSingleNode("/Sequence/Inputs");
    foreach (System.Xml.XmlNode child in inputs.ChildNodes)
    {
        if (child.InnerText == "readOF")
        {
            String commentContents = child.OuterXml;
            System.Xml.XmlComment commentNode = xmlDocument.CreateComment(commentContents);
           // inputs.RemoveChild(child);
      //  inputs.PrependChild(commentNode); 
child.ParentNode.ReplaceChild(commentNode, child);              
            break;
        }
    }


Eric Lynch

Пожалуйста, смотрите решение 2, которое представлено в правильном порядке.

Рейтинг:
20

Eric Lynch

Используя LINQ to XML, вы можете сделать следующее.

using System;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Xml.XPath;

namespace DemoApp
{
   public class Program
   {
     public static void Main(string[] args)
     {
       string text = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<Sequence>
  <Inputs>
    <Input>readOF</Input>
    <Input>readReference</Input>
  </Inputs>
</Sequence>";

       XDocument document = XDocument.Parse(text);
       IEnumerable<XElement> elements = document.XPathSelectElements("/Sequence/Inputs/Input[.='readOF']");

       foreach (var element in elements)
         element.ReplaceWith(new XComment(element.ToString()));

       Console.WriteLine(document.ToString());
    }
  }
}

Для сравнения, вот версия в старом стиле...
var document2 = new XmlDocument();
document2.LoadXml(text);

XmlNodeList nodes = document2.SelectNodes("/Sequence/Inputs/Input[.='readOF']");
foreach (XmlNode node in nodes)
  node.ParentNode.ReplaceChild(document2.CreateComment(node.OuterXml), node);

Для получения информации о XPATH, синтаксис, используемый в XPathSelectElements / SelectNodes, видеть:

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


EM_Y

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

EM_Y

Не могли бы вы объяснить мне разницу между вашим кодом и моим (мой ответ ниже) и почему мой код меняет порядок комментариев и удаляет его на остальные входы ?

Спасибо ^^

Eric Lynch

Ваш код меняет порядок действий. Вы проходите через детей в том порядке, в котором они появляются, но затем вы предваряете (добавляете к началу). Я думаю, что метод AppendChild привел бы к правильному порядку.


Хотя, притворяясь скромным здесь, я думаю, что мой код красивее :)

Richard MacCutchan

Зачем быть скромным? Это классный кусок кода.

Eric Lynch

Нет, я просто пошутил, правда в том, что в этом деле заслуга принадлежит Мисс. Они сделали это легко. Я часто говорю о них, но я думаю, что они хорошо поработали с XML-API в C#.

Richard MacCutchan

Это возможно, но все же требуется некоторая работа, чтобы понять его достаточно, чтобы написать такой код, который использует его эффективно. Мне потребовалось довольно много времени, чтобы разобраться в библиотеке XMLLite. Хотя у меня действительно была фора, написав парсер DOM в моем предыдущем существовании.

Eric Lynch

Никаких проблем, с удовольствием помогу. Кроме того, поздравляю вас с тем, что вы сами приблизились к решению проблемы.

Если вы собираетесь продолжать играть с C# и XML, я настоятельно рекомендую изучить LINQ to XML. Чтобы ответить на этот вопрос, его можно лишь немного сжать. Однако для других задач это экономит много кода и времени. Счастливого кодирования!

EM_Y

В моем кодовом решении Я заменил эти 2 строки
входные.RemoveChild(ребенок);
входные.PrependChild(commentNode);

с
ребенок.ParentNode.ReplaceChild(commentNode, child);
=>порядок соблюден .

Спасибо @Eric за вашу помощь :) Я ценю ваше внимание .

Рейтинг:
0

#realJSOP

Я думаю, вам придется разобрать файл, как если бы это был просто текстовый файл. Я бы подумал о создании класса, который загружает файл по одной строке за раз в объект List<string>, а затем использует linq для детализации списка.

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

Все на одной линии:

<mykey>value</mykey>

Многострочные элементы:
<mykey>
    value
</mykey>

Элементы с неявным закрывающим тегом:
<mykey text="value" />

Это было бы интересное упражнение по программированию, которое могло бы сделать это и позволить такие функции, как добавление/удаление элементов, перемещение элементов в файле, комментирование элементов и просто добавление комментариев.