Maciej Los
Я не уверен, что хорошо вас понимаю...
Я бы предпочел использовать Linq To Xml[^].
//define search criteria
string searchterm = "private";
StringComparison comparison = StringComparison.InvariantCulture;
//create instance of XDocument
XDocument xdoc = Xdocument.Load("FullFileName");
//define parent node for ObjectType nodes
var otsparent = xdoc.Descendants("Types").SingleOrDefault();
//find ObjectType nodes Name starts with "private"
var ots2copy = xdoc.Descendants("ObjectType")
.Where(x=>x.Attribute("Name").Value.StartsWith(searchterm, comparison))
.ToList();
//loop through the list of nodes which meet criteria
int i = 1;
foreach(XElement original in ots2copy)
{
//create deep copy of original node
XElement copy = new XElement(original);
//change Name attribute
copy.Attribute("Name").Value += i.ToString();
//add a copy to parent node
otsparent.Add(copy);
i++;
}
//...
//Save document at the end of process
//xdoc.Save("NewFullFileName.xml");
Результат:
<Types>
<ObjectType Name="private.C53da99cf09a845c6ad14b0412d101132" DisplayName="Graphic" Description="Graphic" Icon="TGML.gif" Base="tgml.TGML" Abstract="0" Implements="" DefaultProperty="" Version="1"></ObjectType>
<ObjectType Name="private.C99cf176f956241a6aabb850d8ff8e44f" DisplayName="Function Block Program" Description="Function block program" Icon="Menta.gif" Base="menta.Program" Abstract="0" Implements="" DefaultProperty="" Version="1">
<Verbs>
<Verb Type="Contain" Name="menta.Module" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
<Verb Type="Contain" Name="menta.Alarm" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
<Verb Type="Contain" Name="system.schedulecommon.ScheduleBase" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
</Verbs>
</ObjectType>
<ObjectType Name="private.C53da99cf09a845c6ad14b0412d1011321" DisplayName="Graphic" Description="Graphic" Icon="TGML.gif" Base="tgml.TGML" Abstract="0" Implements="" DefaultProperty="" Version="1"></ObjectType>
<ObjectType Name="private.C99cf176f956241a6aabb850d8ff8e44f2" DisplayName="Function Block Program" Description="Function block program" Icon="Menta.gif" Base="menta.Program" Abstract="0" Implements="" DefaultProperty="" Version="1">
<Verbs>
<Verb Type="Contain" Name="menta.Module" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
<Verb Type="Contain" Name="menta.Alarm" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
<Verb Type="Contain" Name="system.schedulecommon.ScheduleBase" minOccurs="0" maxOccurs="2147483647" ContainType="DerivedAndBase" SubTarget="Config" />
</Verbs>
</ObjectType>
</Types>
Таким же образом вы должны копировать
OI
узлы. На данный момент неясно, какие узлы должны быть скопированы.
Для получения более подробной информации, пожалуйста, смотрите:
Обзор LINQ to XML (C#)[
^]
Язык .NET-интегрированный запрос для XML-данных[
^]
Основные запросы (LINQ to XML) (C#)[
^]
Другой способ достичь этого-использовать
класс XmlDocument[
^], который предоставляет способ загрузки, проверки, редактирования, добавления (даже
клон[
^ узел]) и позиционировать XML в документе.
Попробуй! Удачи!
[РЕДАКТИРОВАТЬ]
Копировать
OI
узлы:
var oisparent = xdoc.Descendants("ExportedObjects").SingleOrDefault();
var ois2copy = xdoc.Descendants("OI")
.Where(x=>x.Descendants("OI").Count()>1)
.Select((x, i)=> new
{
index = i,
ois = x
})
.ToList();
int j = 1;
foreach(var indexednodes in ois2copy)
{
//create deep copy of original node
XElement copy = new XElement(indexednodes.ois);
foreach(XElement oi in copy.Descendants("OI").Where(x=>x.Attribute("TYPE").Value.StartsWith(searchterm, comparison)))
{
//change Name attribute
oi.Attribute("TYPE").Value += j.ToString();
}
//add a copy to parent node
oisparent.Add(copy);
j++;
}
Maciej Los
Ну, я показал тебе, как этого добиться. Не стесняйтесь улучшать приведенный выше код в соответствии с вашими потребностями. У меня нет достаточно времени, чтобы снова изучить ваше видео. Вы должны предоставить достаточно подробных сведений в тексте, например: ввод и ожидаемый вывод. Если есть потребность, попробуйте написать ему в Пседах-код.
Если мой ответ был полезен, пожалуйста, примите его (зеленая кнопка), чтобы удалить ваш вопрос из списка без ответа.
Твое Здоровье, Мацей
Member 12494414
извините,я постараюсь не тратить ваше время.
Ожидаемый результат для узла exportedObject
Не удалось прикрепить XML здесь: Пожалуйста, найдите скриншот : http://i.imgur.com/fRIJAtgr.png
Maciej Los
Вы должны публиковать xml-контент, а не xml-файл.
[РЕДАКТИРОВАТЬ]
Я видел этот образ. Я понимаю, почему вы не можете найти решение. Есть OI
подузлы. Я постараюсь тебе помочь.