program project1;
{$mode objfpc}{$h+}
uses
SysUtils, fgl,
laz2_dom, laz2_xmlread, laz2_xpath;
const
XML_FILE_NAME = 'plan.xml';
type
TNameList = specialize TFPGMap<string, string>;
var
XPathResult: TXPathVariable;
XMLDocument: TXMLDocument;
ns: TNodeSet;
i, j: Integer;
rootNode: TDOMNode;
pracownicyNode, grupaNode, spotkanieNode: TDOMNode;
nodeName: String;
idStr, imieStr, nazwiskoStr: String;
numerStr, typStr: String;
dataStr, godzinaOdStr, godzinaDoStr, prowadzacyRefStr, pracownicyStr: String;
pracownicyList: TNameList;
begin
pracownicyList := TNameList.Create;
pracownicyList.Sorted := true;
ReadXMLFile(XMLDocument, XML_FILE_NAME);
rootNode := XMLDocument.DocumentElement;
XPathResult := EvaluateXPathExpression('/plan/pracownicy', rootNode);
ns := XPathResult.AsNodeSet;
for i := 0 to ns.Count-1 do
begin
pracownicyNode := TDOMNode(ns[i]);
if pracownicyNode.HasChildNodes then
begin
pracownicyNode := pracownicyNode.FirstChild;
while Assigned(pracownicyNode) do
begin
nodeName := pracownicyNode.NodeName;
if nodeName = 'pracownik' then
begin
idStr := pracownicyNode.Attributes.GetNamedItem('id').NodeValue;
imieStr := pracownicyNode.FindNode('imie').TextContent;
nazwiskoStr := pracownicyNode.FindNode('nazwisko').TextContent;
end;
WriteLn(idStr, ' --> ', imieStr, ' ', nazwiskoStr);
pracownicyList.Add(idStr, imieStr + ' ' + nazwiskoStr);
pracownicyNode := pracownicyNode.NextSibling;
end;
end;
end;
XPathResult.Free;
WriteLn;
WriteLn('numer', #9, 'typ', #9, 'data', #9, 'godzinaOd', #9, 'godzinaDo', #9, 'imie nazwisko');
XPathResult := EvaluateXPathExpression('/plan/cykleDydaktyczne/cyklDydaktyczny/przedmiot/grupaZajeciowa', rootNode);
ns := XPathResult.AsNodeSet;
for i:=0 to ns.Count-1 do
begin
grupaNode := TDOMNode(ns[i]);
nodeName := grupaNode.NodeName;
numerStr := grupaNode.FindNode('numer').TextContent;
typStr := grupaNode.FindNode('typ').TextContent;
spotkanieNode := grupaNode.FindNode('spotkanie');
while spotkanieNode <> nil do
begin
nodeName := spotkanieNode.NodeName;
if nodeName = 'spotkanie' then
begin
dataStr := spotkanieNode.FindNode('data').TextContent;
godzinaOdStr := spotkanieNode.FindNode('godzinaOd').TextContent;
godzinaDoStr := spotkanieNode.FindNode('godzinaDo').TextContent;
prowadzacyRefStr := spotkanieNode.FindNode('prowadzacy').Attributes.GetNamedItem('ref').NodeValue;
if pracownicyList.Find(prowadzacyRefStr, j) then
pracownicyStr := pracownicyList.Data[j] + ' (' + prowadzacyRefStr + ')'
else
pracownicyStr := '(' + prowadzacyRefStr + ')';
WriteLn(numerStr, #9, typStr, #9, dataStr, #9, godzinaOdStr, #9, godzinaDoStr, #9, pracownicyStr);
end;
spotkanieNode := spotkanieNode.NextSibling;
end;
end;
XPathResult.Free;
XMLDocument.Free;
pracownicyList.Free;
end.