Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

XMLDocument - косяк при изменении порядка следования тегов.   Найти похожие ветки 

 
igorserg   (2012-02-07 11:32) [0]

например есть документ:

<Doc>
 <Edit Name="Edit1">
 <Edit Name="Edit2">
 <Edit Name="Edit3">
</Doc>

необходимо передвинуть тег с аттрибутом Name="Edit3" вверх на одну позицию. Должно получиться следующее:

<Doc>
 <Edit Name="Edit1">
 <Edit Name="Edit3">
 <Edit Name="Edit2">
</Doc>

Нашел вот такое решение:

procedure TForm1.MoveNode(Up: boolean);
var
 ListNodes: IXMLNodeList;
 ind, ind_New: integer;
begin
 ListNodes:= CurNode.ParentNode.ChildNodes;
 ind:= ListNodes.IndexOf(CurNode);
 if Up and (ind > 0) then ind_New:= ind - 1;
 if (not Up) and (ind < ListNodes.Count) then ind_New:= ind + 1;
 ListNodes.Insert(ind_New, CurNode);
end;


Где CurNode - сдвигаемый нод.

Но происходит какая-то странность.

На изменение документа стоит процедура:

procedure TForm1.XMLDocAfterNodeChange(const Node: IXMLNode;
 ChangeType: TNodeChange);
begin
 Memo1.Lines.Clear;
 Memo1.Lines.AddStrings(XMLDoc.XML);
end;


После изменения можно выполнить сканирование документа и заполнение древовидной структуры ds: TMemTableEh (библиотеки EhLib):

procedure TForm1.Button1Click(Sender: TObject);
begin
 lstNodes.Clear;

 ds.Close;
 ds.TreeList.Active:= false;
 ds.FieldDefs.Clear;
 ds.AutoIncrement.Reset;
 ds.FieldDefs.Add("id", ftAutoInc);
 ds.FieldDefs.Add("id_Parent", ftInteger);
 ds.FieldDefs.Add("Name", ftString, 255);
 ds.FieldDefs.Add("Node", ftInteger);
 ds.CreateDataSet;
 ds.Open;

 if not XMLDoc.Active then XMLDoc.Active:= true;
 LoadNode(XMLDoc.DocumentElement, 0);

 ds.TreeList.KeyFieldName:= "id";
 ds.TreeList.RefParentFieldName:= "id_Parent";
 ds.TreeList.Active:= true;
end;


Рекурсивная процедура:

procedure TForm1.LoadNode(Node: IXMLNode; id_Parent: integer);
var
 i: integer;
 id: integer;
begin
 ds.Append;
   ds["Name"]:= Node.NodeName;
   ds["id_Parent"]:= id_Parent;
   ds["Node"]:= lstNodes.AddObject(Node.NodeName, TXMLNode(Node));
 ds.Post;
 id:= ds["id"];
 for i:= 0 to Node.ChildNodes.Count - 1 do
   LoadNode(Node.ChildNodes[i], id);
end;


Ну и собственно странность:
До сдвига структура в ds идентична значению XMLDoc.XML.
После сдвига:
в Memo1.Text (XMLDoc.XML) текст нормальный ожидаемый - три тега, порядок соответственно сдвигу

<Doc>
 <Edit Name="Edit1">
 <Edit Name="Edit3">
 <Edit Name="Edit2">
</Doc>

, а в заполняемой структуре (ds) появился еще один элемент, соответствующий сдвигаемому... т.е. как будто структура должна быть такой:

<Doc>
 <Edit Name="Edit1">
 <Edit Name="Edit3">
 <Edit Name="Edit2">
 <Edit Name="Edit3">
</Doc>

Подскажите где косяк?


 
И. Павел ©   (2012-02-07 11:56) [1]

> [0] igorserg   (07.02.12 11:32)

Попробуйте удалять CurNode из ListNodes перед тем, как вставлять его туда еще раз (в функции MoveNode).


 
Медвежонок Пятачок ©   (2012-02-07 12:27) [2]

<Doc>
<Edit Name="Edit1">
<Edit Name="Edit3">
<Edit Name="Edit2">
<Edit Name="Edit3">
</Doc>

Подскажите где косяк?


Почему ни один из узлов Edit не закрыт?


 
igorserg   (2012-02-07 13:07) [3]


> Почему ни один из узлов Edit не закрыт?

Извиняюсь. конечно-же так:
<Doc>
<Edit Name="Edit1"/>
<Edit Name="Edit3"/>
<Edit Name="Edit2"/>
<Edit Name="Edit3"/>
</Doc>


> Попробуйте удалять CurNode из ListNodes перед тем, как вставлять
> его туда еще раз (в функции MoveNode).

Большое спасибо все получлось
procedure TForm1.MoveNode(Up: boolean);
var
 ListNodes: IXMLNodeList;
 ind, ind_New: integer;
begin
 ListNodes:= CurNode.ParentNode.ChildNodes;
 ind:= ListNodes.IndexOf(CurNode);
 if Up and (ind > 0) then ind_New:= ind - 1;
 if (not Up) and (ind < ListNodes.Count) then ind_New:= ind + 1;
 ListNodes.Delete(ind);
 ListNodes.Insert(ind_New, CurNode);
end;


 
Eraser ©   (2012-02-07 22:28) [4]

> [0] igorserg   (07.02.12 11:32)

не хорошо, когда в XML что-то зависит от "физического" порядка следования. Создай атрибут или подтег сортировки, где указывай порядковый номер.


 
igorserg   (2012-02-08 08:10) [5]

Это мне уже второй человек говорит :), может быть не во всех случаях нужно делать хорошо? В данном случае XML описывает структуру визуального представления формы, а не структуру данных. Тут может быть не столько порядок следования важен, сколько порядок вложенности. Так, что на допатрибуты заморачиваться не стал.


 
Плохиш ©   (2012-02-08 10:49) [6]


> XMLDocument - косяк при изменении порядка следования тегов.

Разве в стандарте гарантируется порядок следования тегов? Не там косяки ищите.


 
Eraser ©   (2012-02-08 16:02) [7]

> [5] igorserg   (08.02.12 08:10)


> В данном случае XML описывает структуру визуального представления
> формы, а не структуру данных.

ok, вот и добавь атрибут "порядок следования".


 
Eraser ©   (2012-02-08 16:03) [8]

> Тут может быть не столько порядок следования важен, сколько
> порядок вложенности.

это уже другое.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.164 c
2-1339697624
vasa777
2012-06-14 22:13
2013.03.22
ico с несколькими ico


2-1340050503
ankazh
2012-06-19 00:15
2013.03.22
Отмена добавления новой записи


1-1300638375
maxstels
2011-03-20 19:26
2013.03.22
Автоматические заполнение заготовок процедур


2-1336072088
Глеб
2012-05-03 23:08
2013.03.22
Склеивание форм в дельфи


15-1328942551
AV
2012-02-11 10:42
2013.03.22
Нужен ли XP mode, если на семерку хочу виртуалку поставить?