Поиск по блогу

Показаны сообщения с ярлыком XML. Показать все сообщения
Показаны сообщения с ярлыком XML. Показать все сообщения

четверг, 21 января 2010 г.

Добавление и удаление атрибутов узлов (вершин) в XML в Delphi (с использованием компонента TTreeView)

Предыдущая статья на тему — "Добавление и удаление вершин в XML (визуализация с помощью TTreeView)".

Продолжаю развивать начатую тему про редактирование XML. Сегодня будем добавлять и удалять атрибуты узлов.

Для этого создадим контекстное меню и привяжем его к объекту TValueListEditor, расположенному на закладке Attributes (исходники полученной на ранних этапах заготовки можно скачать). Напомню, что атрибуты и их значения попадают в ValueListEditor благодаря следующему участку кода в обработчике события OnClick экземпляра компонента TTreeView:

try
ValueListEditor.Strings.Clear;
for i := 0 to iNode.AttributeNodes.Count -1 do
ValueListEditor.InsertRow(iNode.AttributeNodes[i].NodeName,
iNode.AttributeNodes[i].Text,true);
except
end;


В меню создаем 2 пункта (Insert и Delete) и прописываем в их обработчиках:

среда, 13 января 2010 г.

Добавление и удаление узлов (вершин) в XML в Delphi (с использованием компонента TTreeView)

Приветствую всех подписчиков и читателей блога "Парсинг от А до Я"! Поздравляю с прошедшими праздниками и желаю в новом году терпения и усердия на пути к достижению поставленных целей. Надеюсь, что вы так же, как я, набрались сил и наполнились энтузиазмом за эти каникулы.

Сегодня появилось немного свободного времени, и я решила посвятить его развитию блога. Итак, проанализировав запросы, по которым приходят на этот ресурс, я решила дополнить его статьей о работе с XML в Delphi. Я уже затрагивала этот вопрос в материале "Отображение XML в виде дерева (TreeView): Delphi". К сожалению, тогда была невнимательной и как-то упустила комментарии о том, что в листинге отображены не все процедуры. В этот раз постараюсь исправиться и наряду с объяснениями выложить исходники того, о чем пойдет речь.

Итак, в той статье было описано отображение XML в TTreeView. А сейчас попытаемся сделать из просмотрщика редактор XML. Не сразу, постепенно. Понимаю, что как таковой самописный редактор XML вам не понадобится, тем более, что в сети можно найти много бесплатных утилит с полным набором требуемых функций, но новичкам будет полезно посмотреть, как сделать это своими руками. Вдруг в каком-нибудь вашем проекте вы решите поработать с XML... Собственно, я и решила написать этот пост про XML, так как стала переделывать RSSAdder: он будет работать не с ini-файлом, а с xml, и пользователям не придется совершать пляски с бубном, чтобы добавить в список новый агрегатор или изменить настройки у существующего.

На первом этапе добавим возможность добавлять узлы на один уровень с выбранным и дочерние узлы. Для этого поместим на форму соответствующие кнопочки и создадим экшэны со следующими обработчиками.

понедельник, 8 декабря 2008 г.

Отображение XML в виде дерева (TreeView): Delphi

Во многих программах конфиги хранятся в файлах формата XML. Встала задача — отобразить XML в виде дерева.

Создаем форму, на которой обязательно должны присутствовать кнопка открытия файла (и OpenDialog, соответственно) и TreeView. Остальное — опционально.
delphi xml editor

Подключаем библиотеки XmlDoc, XMLIntf (про XMLIntf, возможно, напишу отдельным постом).

Объявляем класс TNodeRec.

type
TNodeRec = class
TreeNode : TTreeNode;
XMLNode : iXMLNode;
end;


Переменные:

var
XDoc : TXMLDocument;
FName : String;
bkpXml : String;
CurrNode,
ClipboardNode : iXMLNode;


Функции:


function GetPathByNodeIdx (T : TTreeNode) : TStringList;
begin
Result:= TStringList.Create;
if T=nil then exit;
while T.Parent<>nil do
begin
Result.Insert(0,IntToStr(integer(T.Data)));
T:=T.Parent;
end;
Result.Insert(0,IntToStr(integer(T.Data)));
end;

function SetXmlPosByPathIdx (aSL: TStringList; aXmlDocument : TXMLDocument) : IXMLNode;
var
i : integer;
iNODE : IXMLNode;
begin
iNode:=nil;
if aSL.Count=0 then exit;
try
iNODE:=XDoc.ChildNodes.Nodes [StrToInt(aSL[0])];
for i:=1 to aSL.Count -1 do
iNode:=iNODE.ChildNodes[StrToInt(aSL[i])];
Result:=iNODE;
except
end;
end;


На OnCreate формы вешаем:


procedure TfrmMain.FormCreate(Sender: TObject);
begin
XDocNodesList:=TList.Create;
XDoc:=TXMLDocument.Create(Self);
XDoc.Active:=true;
OpenDialog.InitialDir:=ExtractFilePath(ParamStr(0));
end;


На OnDestroy:
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
ClearNodeList;
XDocNodesList.Free;
XDoc.Free;
end;


Обработчик нажатия на кнопку "Загрузить XML":
procedure TfrmMain.acLoadExecute(Sender: TObject);
var
i : integer;
tmpNode : IXMLNode;
begin
if OpenDialog.Execute then
begin
FName:=OpenDialog.FileName;
SaveDialog.FileName:=FName;
XDoc.LoadFromFile(FName);

for i:=0 to XDoc.ChildNodes.Count - 1 do
begin
tmpNode:=XDoc.ChildNodes[i];
TreeView.Items.AddChildObject(TreeView.TopItem,tmpNode.NodeName,
pointer(i));
if tmpNode.HasChildNodes then TreeView.TopItem.HasChildren:=true;
end;
end;
acRefresh.Execute;
bkpXml:=XDoc.XML.Text;
end;


После этого мы уже можем в первый раз опробовать работу программы: в TreeView загрузится XML, но нам будет видно только рутовую вершину (как на 1-ом рисунке). Чтобы можно было разворачивать узлы и просматривать их текст и атрибуты — надо написать еще несколько обработчиков.

procedure TfrmMain.acRefreshExecute(Sender: TObject);
var
i : integer;
tmpNode : IXMLNode;
begin
RebuildTree;
acRefreshMemBody.execute;
end;

procedure TfrmMain.RebuildTree;
var
i : integer;
XNodeItem : iXmlNode;
PNodeItem,
SelectedTrNode,
TrNodeItem,
TrNodeChild : TTreeNode;
NodeRec,
ChildNodeRec : TNodeRec;
Index : integer;
SL : TStringList;
begin
SL:=GetPathByNodeIdx (TreeView.Selected);
CurrNode:=SetXmlPosByPathIdx (SL, XDoc);
SL.Free;

Index :=0;
TreeView.Items.Clear;
ClearNodeList;
NodeRec:=TNodeRec.Create;
TrNodeItem:=TreeView.TopItem;
NodeRec.TreeNode:=TrNodeItem;
XNodeItem:=XDoc.Node;
NodeRec.XMLNode:=XNodeItem;
XDocNodesList.Add(NodeRec);

while XDocNodesList.Count > Index do
begin
NodeRec:=TNodeRec(XDocNodesList[Index]);
XNodeItem:=NodeRec.XMLNode;
TrNodeItem:=NodeRec.TreeNode;
if XNodeItem=CurrNode then SelectedTrNode:=TrNodeItem;
for i:=0 to XNodeItem.ChildNodes.Count -1 do
begin
if XNodeItem.ChildNodes[i].NodeName<>'#text' then
TrNodeChild:=
TreeView.Items.AddChildObject(
TrNodeItem,
XNodeItem.ChildNodes[i].NodeName,
pointer(i));

ChildNodeRec:=TNodeRec.Create;
ChildNodeRec.TreeNode:=TrNodeChild;
ChildNodeRec.XMLNode:=XNodeItem.ChildNodes[i];
XDocNodesList.Add(ChildNodeRec);
end;
inc(Index);
end;

if SelectedTrNode<>nil then SelectedTrNode.Selected:=true;
TreeView.Select(SelectedTrNode,[]);
end;


Сейчас при перемещении по узлам уже наблюдаем более-менее приемлемый результат:

xml editor delphi

редактирование XML (Delphi)

Дальше остается решить вопросы редактирования и добавления узлов и атрибутов.) Это будет домашним заданием.
___

Редакция от 13.01.2010
Продолжение цикла статей:
Добавление и удаление узлов (вершин) в XML в Delphi (с использованием компонента TTreeView). Там же вы найдете ссылку для скачивания исходников.

вторник, 9 сентября 2008 г.

Разбираемся с форматом RSS. Парсинг RSS на Delphi

Согласно Википедии:

RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами.
То есть, парсинг RSS, по сути, ничем не отличается от парсинга XML.

Текст любого RSS-представления содержит как информацию статического плана (информацию о вашем сайте), так и информацию, которая обновилась, "новости". Каждая запись заключена внутри тега <item>, который содержит элементы TITLE, URL, DESCRIPTION, а также некоторые другие.

Я уже писала о компоненте TXMLDocument, с помощью которого достаточно легко разобрать любой XML-документ. Для парсинга RSS — то, что надо! Сначала обращаемся к ITEM, а потом и ко вложенным элементам. Перед парсингом xml-файл можно загрузить на локальную машину так, как я разбирала в предыдущем примере.

Часть кода (непосредственный парсинг XML):
XMLDoc.FileName := LocalFileName;
XMLDoc.Active:=True;
StartItemNode:=XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
ANode := StartItemNode;
repeat
STitle := ANode.ChildNodes['title'].Text;
sLink := ANode.ChildNodes['link'].Text;
sDesc := ANode.ChildNodes['description'].Text;

// делаем что-нибудь с результатами, например, добавляем в листвью
with LV.Items.Add do
begin
Caption := STitle;
SubItems.Add(sLink);
SubItems.Add(sDesc)
end;

ANode := ANode.NextSibling;
until ANode = nil;

Поделиться