Приветствую всех!
Может кто сталкивался с такой задачкой: работаю с xml-документом, создал ноду, надобавлял в неё вложенных нод и атрибутов, как теперь переименовать её? в смысле был тэг например TestNode, а нужно переименовать на BestNode, при этом нужно сохранить всё что в неё вложено. Неужто нет никакой функции? Неужто только создать новую и перенести всю содержащуюся информацию? CloneNode просто клонирует, а напрямую изменить тэг или как у неё это называется - NodeName - не получается...
Спасибо за внимание.
Маньячим с XML: буква "ц" в начале NodeName... ?
Модератор: Модераторы
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Маньячим с XML: буква "ц" в начале NodeName... ?
Последний раз редактировалось leo_bsv 16.08.2010 21:38:26, всего редактировалось 1 раз.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Возможность переименования элементов и атрибутов была добавлена в спецификацию DOM Level 3, но в fcl-xml оно пока не поддерживается.
Вообще такой потребности не должно возникать. Это аналогично изменению типа уже созданных объектов: такой возможности нет, и ее отстутствие особо не мешает.
Вообще такой потребности не должно возникать. Это аналогично изменению типа уже созданных объектов: такой возможности нет, и ее отстутствие особо не мешает.
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Sergei I. Gorelkin писал(а):Вообще такой потребности не должно возникать. Это аналогично изменению типа уже созданных объектов: такой возможности нет, и ее отстутствие особо не мешает.
В том то всё и дело - пишу программу, которая занимается описанием структур и типов... после чего эти самые шаблоны-структуры будут использоваться для создания объектов...
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
в проекте jedi был модуль по работе с xml как с деревом, вроде бы он умеет данный функционал
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
переименовать получилось только вот так
теперь проблема стала в другом - не получается ввести определенные теги на русском языке... причем другие слова на русском запросто вставляются... проведу более подробный анализ...
Добавлено спустя 13 минут 24 секунды:
почему-то упорно отказывается записывать новый тег под названием "цена"... что за магическое слово непонятно...
Добавлено спустя 7 минут 10 секунд:
ошибка с DOMDocument.CreateElement проявляется если в NodeName первой стоит буква "ц", в середине или конце слова - нода создаётся нормально, что за?..
Добавлено спустя 2 минуты 44 секунды:
причём на заглавную букву Ц такой реакции нет - нода создаётся.
Код: Выделить всё
// создадим новую ноду с нужным именем
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 секунды:
почему-то упорно отказывается записывать новый тег под названием "цена"... что за магическое слово непонятно...
Добавлено спустя 7 минут 10 секунд:
ошибка с DOMDocument.CreateElement проявляется если в NodeName первой стоит буква "ц", в середине или конце слова - нода создаётся нормально, что за?..
Добавлено спустя 2 минуты 44 секунды:
причём на заглавную букву Ц такой реакции нет - нода создаётся.
Последний раз редактировалось leo_bsv 18.08.2010 00:04:16, всего редактировалось 1 раз.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В DOM используются строки widestring с кодировкой utf-16, поэтому при обмене строками с LCL (которая в utf-8) желательно использовать ф-ции utf8decode/utf8encode. Если записываешь строки прямо в тексте программы - то исходник нужно сохранить в кодировке utf-8 и в начало добавить директиву {$codepage utf8}
У буквы 'ц' должен быть код #$446, проверил, все создается.
У буквы 'ц' должен быть код #$446, проверил, все создается.
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
дело было не в кодировке... я тоже думал что в ней, но как оказалось - нет...
текст передаётся из ComboBox'a, который в свою очередь сохраняет его ещё и в файл для возможности повторного использования, с помощью следующего кода
короче после этого самого сохранения сам текст пропадал куда-то из свойства ComboBox.Text ...
сделал присвоение перед этим кодом - всё заработало... странновато прям... куда содержимое девается из этого свойства... вроде не стриаю...
текст передаётся из 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 ...
сделал присвоение перед этим кодом - всё заработало... странновато прям... куда содержимое девается из этого свойства... вроде не стриаю...
