Primo Chalice Ответов: 2

Как заменить текст в нескольких XML-файлах?


- Привет!

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

Теперь я хочу, чтобы все xml-файлы имели тексты, и я хочу что-то вроде следующего:

Текст в XML-файлах

<image>
<caption>This is a caption.</caption>
<credits>This is a test sentence.</credits>
</image>


Требующаяся замена

<credits>
This is a test sentence
</credits>

<image>
<caption>This is a caption.</caption>
</image>


В принципе, я хочу отделить тег "кредиты" изнутри тега и сохранить все остальное как есть. Все изменения будут внесены в импортированные xml - файлы из пути к папке. Я отобразил список файлов в виде списка.

Пожалуйста помочь.

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

Я создал базовую программу для импорта нескольких xml-файлов.

2 Ответов

Рейтинг:
2

Maciej Los

Все очень просто. Все, что вам нужно сделать, это:
1. пройдите цикл через коллекцию файлов в папке с помощью Каталог.Метод GetFiles (System.IO) | Microsoft Docs[^]
2. Загрузите каждый файл (XDocument.Метод Загрузки (System.Xml.Linq) | Microsoft Docs[^])
3. Найдите и удалите узлы "подписи"
4. и, наконец, вставьте их в корневой узел:

string[] files = Directory.GetFiles(@"YourPathhere", "*.xml")
foreach(string sFileName in files)
XDocument xdoc = XDocument.Load(sFileName);
List<XElement> nodes2move = xdoc.Descendants("credits").ToList();
foreach(var n in nodes2move)
{
	n.Remove();	
	xdoc.Root.AddFirst(n);
}
xdoc.Save(sFileName);


Новое содержание документа должно выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<mydata>
  <credits>This is a test sentence.</credits>
  <image>
    <caption>This is a caption.</caption>
  </image>
</mydata>


Для получения более подробной информации, пожалуйста, смотрите:
XContainer.Способ Элементов (Системы.В формате XML.По LINQ) | Майкрософт Документы[^]
XNode.Метод Remove (Системы.В формате XML.По LINQ) | Майкрософт Документы[^]
XContainer.Метод AddFirst (System.Xml.Linq) | Microsoft Docs[^]


Рейтинг:
1

RickZeeland

Самый простой и, вероятно, самый быстрый способ может заключаться в том, чтобы сделать простую замену на основе файлов, вы можете прочитать файл в List<string> с File.ReadAllLines().
Затем выполните цикл по всем строкам и замените строки "кредиты", удалив их и вставив в новую позицию.

Другим способом было бы использовать XElement класс, смотри: Класса XElement (Системы.В формате XML.По LINQ) | Майкрософт Документы[^]
и: Сериализация XML-деревьев (C#) | Microsoft Docs[^]
Это должно помочь вам начать:

test.xml

<?xml version="1.0" encoding="utf-8"?>
<root>
  <image>
    <caption>This is a caption.</caption>
    <credits>This is a test sentence.</credits>
  </image>
  <image>
    <caption>This is a caption 2.</caption>
    <credits>This is a test sentence 2.</credits>
  </image>
</root>

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

string fileName = @"test2.xml";
var xmlSource = XElement.Load(fileName);
var xList = xmlSource.Elements("image");

foreach (var x in xList)
{
    if (x == null)
    {
        continue;
    }

    var credits = x.Element("credits");

    if (credits != null)
    {
        Debug.Print(credits?.Value);
        var c = credits;
        c.Remove();
    }
}

xmlSource.Save(fileName + "new");


Primo Chalice

- Привет!

Не могли бы вы прислать мне фрагмент того же самого с помощью XDocument?

Пожалуйста

С уважением
Аман

Maciej Los

5ed!