Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1344000196
toropoff
2012-08-03 17:23
2013.03.22
Spell Check


2-1329678422
Zheksonz
2012-02-19 23:07
2013.03.22
Почему на панели TCategoryPanelGroup не виден TLabel?


8-1230645984
Б
2008-12-30 17:06
2013.03.22
Где найти DirectX SDK для Delphi?


15-1351542602
Юрий
2012-10-30 00:30
2013.03.22
С днем рождения ! 30 октября 2012 вторник


15-1343414133
KilkennyCat
2012-07-27 22:35
2013.03.22
Чем бы учитывать свои радиодетальки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский