Маньячим с XML: буква "ц" в начале NodeName... ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Маньячим с XML: буква "ц" в начале NodeName... ?

Сообщение leo_bsv » 11.08.2010 02:37:11

Приветствую всех!
Может кто сталкивался с такой задачкой: работаю с xml-документом, создал ноду, надобавлял в неё вложенных нод и атрибутов, как теперь переименовать её? в смысле был тэг например TestNode, а нужно переименовать на BestNode, при этом нужно сохранить всё что в неё вложено. Неужто нет никакой функции? Неужто только создать новую и перенести всю содержащуюся информацию? CloneNode просто клонирует, а напрямую изменить тэг или как у неё это называется - NodeName - не получается...
Спасибо за внимание.
Последний раз редактировалось leo_bsv 16.08.2010 21:38:26, всего редактировалось 1 раз.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Маньячим с XML: не получается сделать RenameNode...

Сообщение Sergei I. Gorelkin » 11.08.2010 03:08:03

Возможность переименования элементов и атрибутов была добавлена в спецификацию DOM Level 3, но в fcl-xml оно пока не поддерживается.

Вообще такой потребности не должно возникать. Это аналогично изменению типа уже созданных объектов: такой возможности нет, и ее отстутствие особо не мешает.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Маньячим с XML: не получается сделать RenameNode...

Сообщение leo_bsv » 11.08.2010 12:34:32

Sergei I. Gorelkin писал(а):Вообще такой потребности не должно возникать. Это аналогично изменению типа уже созданных объектов: такой возможности нет, и ее отстутствие особо не мешает.

В том то всё и дело - пишу программу, которая занимается описанием структур и типов... после чего эти самые шаблоны-структуры будут использоваться для создания объектов...
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Маньячим с XML: не получается сделать RenameNode...

Сообщение Padre_Mortius » 13.08.2010 13:19:02

в проекте jedi был модуль по работе с xml как с деревом, вроде бы он умеет данный функционал
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Маньячим с XML: не получается сделать RenameNode...

Сообщение leo_bsv » 16.08.2010 21:13:17

переименовать получилось только вот так
Код: Выделить всё
                  // создадим новую ноду с нужным именем
                  NewNode := FDoc.CreateElement(Buf.Name);

                  // создадим ноду с текстом
                  TextNode := FDoc.CreateTextNode(Buf.Value);
                  NewNode.AppendChild(TextNode);

                  // скопируем все атрибуты
                  for a:=0 to Node.Attributes.Length-1 do
                    TDOMElement(NewNode).SetAttribute(
                      Node.Attributes[a].NodeName,
                      Node.Attributes[a].NodeValue
                    );

                  // перепишем в новую ноду все вложенные ноды полностью с ветвями
                  for i:=0 to Node.ChildNodes.Count-1 do begin
                      NewNode.AppendChild(Node.ChildNodes[i].CloneNode(true));
                      // обновим ссылки в дереве TreeView
                      TreeView.BeginUpdate;
                      for j:=0 to TreeView.Items.Count-1 do
                        if TreeView.Items[j].Data=Pointer(Node.ChildNodes[i]) then
                          TreeView.Items[j].Data:=NewNode.LastChild;
                      TreeView.EndUpdate;
                  end;
                  // получим родителя
                  ParNode:=Node.ParentNode;

                  // добавим новую ветвь в дерево
                  if ParNode=nil then begin
                    // т.к. корень может быть только один - сначала удалим его,
                    // а уже потом добавим новый
                    TDOMElement(Node).Destroy;
                    FDoc.AppendChild(NewNode);
                  end
                  else begin
                    // если элемент не корневой - можно временно сохранить старую ноду,
                    // добавить перед ней новую, а затем удалить старую
                    // это предотвратит смещение элемента в дереве TreeView
                    TDOMElement(Node.ParentNode).InsertBefore(NewNode,Node);
                    TDOMElement(Node).Destroy;
                  end;

                  // обновим дерево
                  with TreeView do begin
                    BeginUpdate;
                    Selected.Text:=TreeName(NewNode);
                    Selected.Data:=NewNode;
                    EndUpdate;
                  end;                                               


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

Добавлено спустя 13 минут 24 секунды:
почему-то упорно отказывается записывать новый тег под названием "цена"... что за магическое слово непонятно... :shock:

Добавлено спустя 7 минут 10 секунд:
ошибка с DOMDocument.CreateElement проявляется если в NodeName первой стоит буква "ц", в середине или конце слова - нода создаётся нормально, что за?..

Добавлено спустя 2 минуты 44 секунды:
причём на заглавную букву Ц такой реакции нет - нода создаётся.
Последний раз редактировалось leo_bsv 18.08.2010 00:04:16, всего редактировалось 1 раз.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Маньячим с XML: буква "ц" в начале NodeName... ?

Сообщение Sergei I. Gorelkin » 16.08.2010 22:33:58

В DOM используются строки widestring с кодировкой utf-16, поэтому при обмене строками с LCL (которая в utf-8) желательно использовать ф-ции utf8decode/utf8encode. Если записываешь строки прямо в тексте программы - то исходник нужно сохранить в кодировке utf-8 и в начало добавить директиву {$codepage utf8}
У буквы 'ц' должен быть код #$446, проверил, все создается.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Маньячим с XML: буква "ц" в начале NodeName... ?

Сообщение leo_bsv » 16.08.2010 22:51:34

дело было не в кодировке... я тоже думал что в ней, но как оказалось - нет...
текст передаётся из ComboBox'a, который в свою очередь сохраняет его ещё и в файл для возможности повторного использования, с помощью следующего кода
Код: Выделить всё
  b:=false;
  for i:=0 to el.Items.Count-1 do
    if el.Items[i]=el.Text then begin
      el.Items.Move(i,0);
      inc(b);
    end;
  if not b then el.Items.Add(el.Text);
  el.Items.SaveToFile(fn);

короче после этого самого сохранения сам текст пропадал куда-то из свойства ComboBox.Text ...
сделал присвоение перед этим кодом - всё заработало... странновато прям... куда содержимое девается из этого свойства... вроде не стриаю...
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

Рейтинг@Mail.ru