Добавление тегов XML вокруг текущих тегов в С#

112
8

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

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

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

Итак, мой вопрос: как добавить теги вокруг некоторых текущих тегов? (Убей меня за ужасную формулировку).

XML выглядит примерно так:

<Parent>

<info>
<id>1234</id>
<secondary_id>ABC-1234</secondary_id>
</info>

<Child>Something</child>
<child2>Something else</child2>
<child3>Something else here</child3>

<Summary>
<text>1234</text>
</Summary>

</Parent>

И то, что мне нужно сделать, - это динамически добавлять теги вокруг дочерних тегов выше, чтобы получить что-то вроде этого:

     <info>
<id>1234</id>
<secondary_id>ABC-1234</secondary_id>
</info>

<info_2>
<Child>Something</child>
<child2>Something else</child2>
<child3>Something else here</child3>
</info_2>

<Summary>
<text>1234</text>
</Summary>

</Parent>

SSIS использует foreach для прокрутки всех файлов XML. Моя теория на этом этапе заключается в том, чтобы добавить задачу сценария, взять текущую переменную файла и использовать ее для загрузки и редактирования XML, а затем сохранить ее обратно до того, как задача потока данных подберет ее и извлечет данные.

enter image description here

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

Текущий код в моей задаче скрипта:

public void Main()
{
//Get the variable from the foreach which contains the current file name.

string filename = Convert.ToString(Dts.Variables["User::File_Name"]);

//Create a new XML document object and then load the current file into it.

XmlDocument doc = new XmlDocument();
doc.Load(filename);
}

Но потом я понятия не имею, как добавить эти теги!

спросил(а) 2021-01-19T18:22:06+03:00 1 месяц, 1 неделя назад
1
Решение
60

Найти элементы, имя которых начинается с 'child' Создайте новый родительский элемент info_2 заполненный копией найденных элементов в качестве содержимого Удалите исходные элементы, найденные в шаге 1, с дерева

Вот пример:

var raw = @"<Parent>
<info>
<id>1234</id>
<secondary_id>ABC-1234</secondary_id>
</info>

<child>Something</child>
<child2>Something else</child2>
<child3>Something else here</child3>

<Summary>
<text>1234</text>
</Summary>
</Parent>";
var doc = XDocument.Parse(raw);

//step 1
var elements = doc.Root.Elements().Where(o => o.Name.LocalName.StartsWith("child"));

//step 2
var newElement = new XElement("info_2", elements);
doc.Root.Element("info").AddAfterSelf(newElement);

//step 3:
elements.Remove();

//print result
Console.WriteLine(doc.ToString());

Вывод:

<Parent>
<info>
<id>1234</id>
<secondary_id>ABC-1234</secondary_id>
</info>
<info_2>
<child>Something</child>
<child2>Something else</child2>
<child3>Something else here</child3>
</info_2>
<Summary>
<text>1234</text>
</Summary>
</Parent>

ответил(а) 2021-01-19T18:22:06+03:00 1 месяц, 1 неделя назад
43

Отличное решение от har07.

Я редактировал имена, но вот код, который решил мою проблему:


    public void Main()
{

string filename = Convert.ToString(Dts.Variables["User::File_Name"].Value);

XDocument xml = new XDocument();

var doc = XDocument.Load(filename);

var element1 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("bob"));
var element2 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("mice"));
var element3 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("car"));
var element4 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("dog"));
var element5 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("cat"));
var element6 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("number"));
var element7 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("thing"));

var newElement = new XElement("New_Tag", element1, element2, element3, element4, element5, element6, element7);
doc.Root.Element("Some_Tag").AddBeforeSelf(newElement);

element1.Remove();
element2.Remove();
element3.Remove();
element4.Remove();
element5.Remove();
element6.Remove();
element7.Remove();

doc.Save(filename);

Dts.TaskResult = (int)ScriptResults.Success;
}

ответил(а) 2021-01-19T18:22:06+03:00 1 месяц, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема