Primo Chalice Ответов: 1

Как скопировать данные из исходного XML в другой XML в той же структуре?


- Привет!

У меня есть XML-файл с определенной структурой, как показано ниже:
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<h3>This is a h3 tag.</h3>
<p>This is a paragraph.</p>
<h4>This is a h4 tag.</p>
<h4>This is a h4 tag.</h4>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<h5>This is a h5 tag</h5>


Я хочу, чтобы это было похоже:

<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a h3 tag.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a h4 tag.</absatz>
<absatz>This is a h4 tag.</h4>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a h5 tag</absatz>


Что я получаю:

<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a paragraph.</absatz>
<absatz>This is a h3 tag.</absatz>
<absatz>This is a h4 tag.</h4>
<absatz>This is a h4 tag.</absatz>
<absatz>This is a h5 tag</absatz>


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

//Insert <p>

var articlepara = secelement.Elements("p").ToList();
foreach (var para in articlepara)
{
   string paragraphvalue = para.Value;
   XElement paraelement = new XElement("absatz", paragraphvalue);

   xedoc.Element("artikel").Element("inhalt").Element("text").Add(paraelement);
}

//Insert <h3>
var hthree = secelement.Elements("h3").ToList();

foreach (var hth in hthree)
{
   string hthreevalue = hth.Value;
   XElement hthelement = new XElement("absatz", hthreevalue);

   xedoc.Element("artikel").Element("inhalt").Element("text").Add(hthelement);
}

//Insert <h4>
var hfour = secelement.Elements("h4").ToList();

foreach (var hfo in hfour)
{
   string hfourvalue = hfo.Value;
   XElement hfoelement = new XElement("absatz", hfourvalue);

   xedoc.Element("artikel").Element("inhalt").Element("text").Add(hfoelement);
}

//Insert <h5>
var hfive = secelement.Elements("h5").ToList();

foreach (var hfi in hfive)
{
   string hfivevalue = hfi.Value;
   XElement hfielement = new XElement("absatz", hfivevalue);

   xedoc.Element("artikel").Element("inhalt").Element("text").Add(hfielement);
}

Richard MacCutchan

Используйте свой отладчик, чтобы узнать, что происходит. Вы также можете упростить этот код, создав один метод, который принимает имя тега и преобразует все записи в "absatz". Или принимает два имени тегов и преобразует все записи с первым именем во второе.

Primo Chalice

- Привет!

Что я могу видеть, так это то, что он сначала создает все экземпляры then < h3 > И так далее. Но разве он не должен вставлять, как и когда он нашел соответствующий элемент? Я имею в виду, даже если это чтение файла после первого появления &ЛТ; Н3 &ГТ; должно быть написано в качестве четвертого &ЛТ;к услугам гостей отеля absatz&ГТ;да?

Richard MacCutchan

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

Richard MacCutchan

У вас есть плохо сформированная запись h4 в исходном XML-файле.

Primo Chalice

- Привет!

Извините, это моя ошибка.

1 Ответов

Рейтинг:
0

Maciej Los

Проверить это:

string xcontent = @"<root>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<h3>This is a h3 tag.</h3>
<p>This is a paragraph.</p>
<h4>This is a h4 tag.</h4>
<h4>This is a h4 tag.</h4>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
<h5>This is a h5 tag</h5>
</root>";

Dictionary<string, string> converter = new Dictionary<string, string>();
converter.Add("root", "root");
converter.Add("p", "absatz");
converter.Add("h3", "absatz");
converter.Add("h4", "absatz");
converter.Add("h5", "absatz");

XDocument xdoc = XDocument.Parse(xcontent);
foreach(XElement xele in xdoc.Descendants())
{
	Console.WriteLine("Replacing: '{0}' => '{1}'", xele.Name, converter[xele.Name.ToString()]);
	xele.Name = converter[xele.Name.ToString()];
}

xdoc.Save("newfullfilename.xml");


Преобразует ваш xml-файл в нижеприведенную форму:
<root>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a h3 tag.</absatz>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a h4 tag.</absatz>
  <absatz>This is a h4 tag.</absatz>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a paragraph.</absatz>
  <absatz>This is a h5 tag</absatz>
</root>


Пожалуйста, прочтите подробнее об этом:
Класс словаря[^]
Классе XDocument (Системы.В формате XML.По LINQ) | Майкрософт Документы[^]

Удачи вам!