Member 12724052 Ответов: 1

Прикрепление скриншота в ответе


Только то, что написано в названии.

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


не сталкиваясь с outofmemoryexception

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

........

Patrice T

Каков размер XML ?

Maciej Los

Не делайте репостов!!!
http://www.codeproject.com/Questions/1128494/Replace-with-regex-if-does-not-end-with-string[^]
Вместо этого попробуйте улучшите свой предыдущий вопрос.

Maciej Los

Основываясь на вашем видео, кажется, что вы хотите скопировать весь контент ObjectType узел с DisplayName атрибут "Программа Функционального Блока"в его родительский узел, а затем изменить его Name атрибут, добавляя 1, 2, 3 и т. д. в конце концов. Затем вы хотите сделать то же самое с OI узел под ExportedObjects- Я прав?
Обратите внимание, что xml-файл, представленный в видео, отличается от приведенного выше. Почему некоторые узлы, представленные в видео, дублируются?

1 Ответов

Рейтинг:
5

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++;
}


Member 12724052

---

Maciej Los

Ну, я показал тебе, как этого добиться. Не стесняйтесь улучшать приведенный выше код в соответствии с вашими потребностями. У меня нет достаточно времени, чтобы снова изучить ваше видео. Вы должны предоставить достаточно подробных сведений в тексте, например: ввод и ожидаемый вывод. Если есть потребность, попробуйте написать ему в Пседах-код.
Если мой ответ был полезен, пожалуйста, примите его (зеленая кнопка), чтобы удалить ваш вопрос из списка без ответа.
Твое Здоровье, Мацей

Member 12494414

извините,я постараюсь не тратить ваше время.
Ожидаемый результат для узла exportedObject

Не удалось прикрепить XML здесь: Пожалуйста, найдите скриншот : http://i.imgur.com/fRIJAtgr.png

Maciej Los

Вы должны публиковать xml-контент, а не xml-файл.
[РЕДАКТИРОВАТЬ]
Я видел этот образ. Я понимаю, почему вы не можете найти решение. Есть OI подузлы. Я постараюсь тебе помочь.

Maciej Los

См. обновленный ответ ;)
Извините, но результаты не отображаются. Я подозреваю ошибку на этом форуме...