Member 12692000 Ответов: 1

Как добавить новый узел в файл с определенным значением из другого файла?


Привет, я пытаюсь создать программу, имеющую следующие шаги:
1) получить все xml файлы из заданного пользователем пути
2) Откройте каждый из файлов (если таковые имеются) и выполните поиск узлов <institution> где он находится в формате <funding-source><institution-wrap><institution>...</institution></institution-wrap></funding-source>
3) получить значение узлов <institution> и найдите точное значение в поле база данных xml внутри узлов <skosxl:literalForm xml:lang="...">
4) Если найдено, то получите значение атрибута его родительского узла <skos:Concept rdf:about="..."> минус строка http://dx.doi.org/
5) Добавьте узел <institution-id institution-id-type="fundref"> в xml - файле после <institution> узел со значением like <funding-source><institution-wrap><institution>...</institution><institution-id institution-id-type="fundref">VALUE of the rdf:about attribute</institution-id></institution-wrap></funding-source>
Вот это да пример входного файла и желаемый результат для этого файла.

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

string pathToUpdatedFile = @"D:\test\test2\Jobs\IEEE_sample - Copy.xml";
			var files=Directory.GetFiles(pathToUpdatedFile,"*.xml");
			foreach (var file in files)
			{
				var fundingDoc = XDocument.Load(@"D:\test\test2\Jobs\fundref.xml");
				XNamespace rdf=XNamespace.Get("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
				XNamespace skosxl = XNamespace.Get("http://www.w3.org/2008/05/skos-xl#");
				XNamespace skos=XNamespace.Get("http://www.w3.org/2004/02/skos/core#");
				
				var targetAtt = fundingDoc.Descendants(skos+"Concept").Elements(skosxl+"prefLabel")
					.ToLookup(s => (string)s.Element(skosxl+"literalForm"), s => (string)s.Parent.Attribute(rdf+"about"));
				XDocument outDoc = XDocument.Load(pathToUpdatedFile,LoadOptions.PreserveWhitespace);
				foreach (var f in outDoc.Descendants("funding-source").Elements("institution-wrap"))
				{
					if (f.Element("institution-id") == null)
					{
						var name = (string)f.Element("institution");
						var x = targetAtt[name].FirstOrDefault(); // just take the first one
						if (x != null)
							
							f.Add(new XElement("institution-id", new XAttribute("institution-id-type","fundref"),x.Substring(@"http://dx.doi.org/".Length)));
					}
					outDoc.Save(file);
				}
				
				Console.ReadLine();

Но он не делает того, что я описал выше...может ли кто-нибудь помочь?
Кроме того, там могут быть идентичные <skosxl:literalForm xml:lang="..."> значения в xml - файле базы данных (но с другим атрибутом (rdf:about) values), в этом случае возьмите значение первого совпадения и напишите txt-файл, говорящий, что значение появляется несколько раз в базе данных или что-то в этом роде, просто чтобы уведомить пользователя, если правильное значение вставлено в файл.

1 Ответов

Рейтинг:
1

Gerry Schmitz

1) Чтение xml-файла в строку
2) десериализовать XML в класс
3) обновите класс
4) сериализировать класс в XML (строка)
5) сохранить xml

Использование специальной вставки в vs чтобы получить классы из XML / JSON-файле.


Member 12692000

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

Gerry Schmitz

В вашем подходе нет ничего плохого ... если это сработает.

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

Я использую LINQ to XML, но только тогда, когда это соответствует ситуации. И так как ваша "ситуация" не работала ... Но "твик" прочь!!