Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c