Как добавить новый узел в файл с определенным значением из другого файла?
Привет, я пытаюсь создать программу, имеющую следующие шаги:
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-файл, говорящий, что значение появляется несколько раз в базе данных или что-то в этом роде, просто чтобы уведомить пользователя, если правильное значение вставлено в файл.