Odpověď

Jméno:
E-mail:
Předmět:
Ikona zprávy:

Ověření:
Datový typ v Delphi, který má True a False:

Zkratky: stiskněte shift+alt+s pro odeslání nebo shift+alt+p pro prohlédnutí


Shrnutí tématu

Poslal: Kony
« kdy: 15-11-2017, 16:36:21 »

at zkousim jak zkousim tak nic..

Kód: Delphi [Vybrat]
  1. Document.LoadFromStream('http://xxx.xxx.xxx.xxx:10001/oscamapi.html?part=status');



Takze jsem to vyresil takto :

nactu soubor xml do memo pomoci

Kód: Delphi [Vybrat]
  1. DownloadURL_NOCache('http://root:rootjaksvina@172.16.33.204:10001/oscamapi.html?part=status', verze);


a potom

Kód: Delphi [Vybrat]
  1. Document := LoadXMLData(verze);

a jede to uuplne krasne..
Poslal: xnukes
« kdy: 15-11-2017, 15:52:15 »

Takze dekuji mockrat pomoc od Delfina.. Vyresili jsme to uuuplne perfektne..

 pokud by nekdo potreboval tak je to tady :

Kód: Delphi [Vybrat]
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, XMLIntf, XMLDoc;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Label1: TLabel;
  13.     Label2: TLabel;
  14.     Label3: TLabel;
  15.     Label4: TLabel;
  16.     Edit1: TEdit;
  17.     Label6: TLabel;
  18.     Label7: TLabel;
  19.     Label8: TLabel;
  20.     Label9: TLabel;
  21.     Label5: TLabel;
  22.     procedure Button1Click(Sender: TObject);
  23.   private
  24.     { Private declarations }
  25.   public
  26.     { Public declarations }
  27.   end;
  28.  
  29. var
  30.   Form1: TForm1;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35.  
  36. procedure TForm1.Button1Click(Sender: TObject);
  37. var
  38.   Oscam: IXMLNode;
  39.   Status: IXMLNode;
  40.   Client: IXMLNode;
  41.   Request: IXMLNode;
  42.   Connect: IXMLNode;
  43.   Document: IXMLDocument;
  44.  
  45.   function CheckNode(const Node: IXMLNode; const Name: string = ''; Required: Boolean = True): IXMLNode;
  46.   begin
  47.     Result := Node;
  48.     if (Required and not Assigned(Result)) or ((Name <> '') and Assigned(Result) and (Result.NodeName <> Name)) then
  49.       raise Exception.CreateFmt('Expected node "<%s>" not found.', [Name]);
  50.   end;
  51.  
  52.   function ChildNode(const Node: IXMLNode; const Name: string): IXMLNode;
  53.   begin
  54.     Result := Node.ChildNodes.FindNode(Name);
  55.   end;
  56.  
  57.   function AttrValue(const Node: IXMLNode; const Name: string; const Null: string = ''; Required: Boolean = False): string;
  58.   var
  59.     Value: OleVariant;
  60.   begin
  61.     Result := Null;
  62.     if Required and not Node.HasAttribute(Name) then
  63.       raise Exception.CreateFmt('Expected attribute "%s" not found.', [Name]);
  64.     Value := Node.Attributes[Name];
  65.     if not VarIsNull(Value) then
  66.       Result := VarToStr(Value);
  67.   end;
  68.  
  69. begin
  70.   Document := LoadXMLDocument('oscam.xml');                 // nacteme XML; jina moznost je nacist jej ze stringu pomoci LoadXMLData
  71.   if not Assigned(Document) then
  72.     raise Exception.Create('XML loading failed.');
  73.  
  74.   Oscam := CheckNode(Document.DocumentElement, 'oscam');      // <oscam> node
  75.   Status := CheckNode(ChildNode(Oscam, 'status'));            // <status> node
  76.   Client := CheckNode(Status.ChildNodes[0], 'client');        // <client> node, 1. v poradi
  77.  
  78.   while Assigned(Client) do                                   // iterace dokud nenajdeme node <client> s hledanym "name" atributem
  79.   begin
  80.     if AttrValue(Client, 'name') = Edit1.Text then               // <client name="?"> - nasli jsme klienta
  81.     begin
  82.       Label5.Caption := '';
  83.       Request := CheckNode(ChildNode(Client, 'request'));     // <client><request>
  84.       Connect := CheckNode(ChildNode(Client, 'connection'));  // <client><connection>
  85.  
  86.       Label1.Caption := AttrValue(Client, 'name');            // <client name="?">
  87.       Label2.Caption := AttrValue(Client, 'protocol');        // <client protocol="?">
  88.       Label3.Caption := AttrValue(Request, 'answered');       // <client><request answered="?">
  89.       Label4.Caption := AttrValue(Connect, 'ip');             // <client><connection ip="?">
  90.  
  91.       Break;                                                  // koncime iteraci
  92.     end
  93.      else
  94.       begin
  95.         Label5.Caption := 'Login odpojen a nebo neexistuje';
  96.       end;
  97.     Client := CheckNode(Client.NextSibling, 'client', False); // dosadime nasledujici <client> node (pokud nebyl posledni)
  98.   end;
  99. end;


Jen jeste otazka.... jak natahnout xml soubor primo ze serveru abych nemusel xml soubor predukladat na disk.. ??

TFileStream ?
Poslal: Kony
« kdy: 15-11-2017, 15:12:09 »

Takze dekuji mockrat pomoc od Delfina.. Vyresili jsme to uuuplne perfektne..

 pokud by nekdo potreboval tak je to tady :

Kód: Delphi [Vybrat]
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, XMLIntf, XMLDoc;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Label1: TLabel;
  13.     Label2: TLabel;
  14.     Label3: TLabel;
  15.     Label4: TLabel;
  16.     Edit1: TEdit;
  17.     Label6: TLabel;
  18.     Label7: TLabel;
  19.     Label8: TLabel;
  20.     Label9: TLabel;
  21.     Label5: TLabel;
  22.     procedure Button1Click(Sender: TObject);
  23.   private
  24.     { Private declarations }
  25.   public
  26.     { Public declarations }
  27.   end;
  28.  
  29. var
  30.   Form1: TForm1;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35.  
  36. procedure TForm1.Button1Click(Sender: TObject);
  37. var
  38.   Oscam: IXMLNode;
  39.   Status: IXMLNode;
  40.   Client: IXMLNode;
  41.   Request: IXMLNode;
  42.   Connect: IXMLNode;
  43.   Document: IXMLDocument;
  44.  
  45.   function CheckNode(const Node: IXMLNode; const Name: string = ''; Required: Boolean = True): IXMLNode;
  46.   begin
  47.     Result := Node;
  48.     if (Required and not Assigned(Result)) or ((Name <> '') and Assigned(Result) and (Result.NodeName <> Name)) then
  49.       raise Exception.CreateFmt('Expected node "<%s>" not found.', [Name]);
  50.   end;
  51.  
  52.   function ChildNode(const Node: IXMLNode; const Name: string): IXMLNode;
  53.   begin
  54.     Result := Node.ChildNodes.FindNode(Name);
  55.   end;
  56.  
  57.   function AttrValue(const Node: IXMLNode; const Name: string; const Null: string = ''; Required: Boolean = False): string;
  58.   var
  59.     Value: OleVariant;
  60.   begin
  61.     Result := Null;
  62.     if Required and not Node.HasAttribute(Name) then
  63.       raise Exception.CreateFmt('Expected attribute "%s" not found.', [Name]);
  64.     Value := Node.Attributes[Name];
  65.     if not VarIsNull(Value) then
  66.       Result := VarToStr(Value);
  67.   end;
  68.  
  69. begin
  70.   Document := LoadXMLDocument('oscam.xml');                 // nacteme XML; jina moznost je nacist jej ze stringu pomoci LoadXMLData
  71.   if not Assigned(Document) then
  72.     raise Exception.Create('XML loading failed.');
  73.  
  74.   Oscam := CheckNode(Document.DocumentElement, 'oscam');      // <oscam> node
  75.   Status := CheckNode(ChildNode(Oscam, 'status'));            // <status> node
  76.   Client := CheckNode(Status.ChildNodes[0], 'client');        // <client> node, 1. v poradi
  77.  
  78.   while Assigned(Client) do                                   // iterace dokud nenajdeme node <client> s hledanym "name" atributem
  79.   begin
  80.     if AttrValue(Client, 'name') = Edit1.Text then               // <client name="?"> - nasli jsme klienta
  81.     begin
  82.       Label5.Caption := '';
  83.       Request := CheckNode(ChildNode(Client, 'request'));     // <client><request>
  84.       Connect := CheckNode(ChildNode(Client, 'connection'));  // <client><connection>
  85.  
  86.       Label1.Caption := AttrValue(Client, 'name');            // <client name="?">
  87.       Label2.Caption := AttrValue(Client, 'protocol');        // <client protocol="?">
  88.       Label3.Caption := AttrValue(Request, 'answered');       // <client><request answered="?">
  89.       Label4.Caption := AttrValue(Connect, 'ip');             // <client><connection ip="?">
  90.  
  91.       Break;                                                  // koncime iteraci
  92.     end
  93.      else
  94.       begin
  95.         Label5.Caption := 'Login odpojen a nebo neexistuje';
  96.       end;
  97.     Client := CheckNode(Client.NextSibling, 'client', False); // dosadime nasledujici <client> node (pokud nebyl posledni)
  98.   end;
  99. end;


Jen jeste otazka.... jak natahnout xml soubor primo ze serveru abych nemusel xml soubor predukladat na disk.. ??
Poslal: rustymattock
« kdy: 15-11-2017, 00:48:09 »

nedal mi spát ten tvůj zvláštní node <status>

Jestli máš někde dále v XML (kam si nám to už nezkopíroval) konec uzlu <status/>, tak všechny uzly <client> patří právě uzlu <status> a nikoliv DocumetElementu.
Takže namísto:
Label1.Caption = XMLDocument1.DocumentElement.ChildNodes.Nodes[f].Attributes['name'];
by se musel vnořit o jednu úroveň hlobjěji:
a = XMLDocument1.DocumentElement.ChildNodes.Nodes['status'].ChildNodes.Nodes[f].Attributes['name'];
if a= to_co_chci then
begin
  mám _můj_uzel_můžu_načíst_další_atributy
end;
Poslal: rustymattock
« kdy: 14-11-2017, 23:56:45 »

odpočítej si kolik uzlú (všech s jakámkoliv názvem, které jsou v hierarchii hned pod documentelemntem OSCAM.
To jest:
status (byť jsem měl za to, že element má na konci lomítko, když není párový, ale já tomu zas tolik nerozumím)
client
už ale nikoli request, jelikož ten už patří jako child uzlu client.
další v pořadí je další client.... atd

jestli máš neznámý počet uzlů, tak zkus třeba tohle. Zjistí počet uzlů a systematický zjišťuje, zda není atribut name právě ten, který hledáš:


Count, f :integer;
a:widestring;

a pak:
Count:=XMLDocument1.DocumentElement.ChildNodes.Nodes.Count;
For f:=0 to Count-1 do
begin
  a:=XMLDocument1.DocumentElement.ChildNodes.Nodes[f].Attributes['name'];
  if a:=to_co_chci then
  begin

  end;
end;

může být ?
Poslal: Kony
« kdy: 14-11-2017, 23:43:05 »

ale poprosim o to jak si na to prisel ze bude

...ChildNodes.Nodes[4]   bude kony1
...ChildNodes.Nodes[5]   bude kony2
...ChildNodes.Nodes[6]   bude kony3
Poslal: rustymattock
« kdy: 14-11-2017, 23:38:38 »

jestli se mi ještě oči nekříží, tak se opravuji...
...ChildNodes.Nodes[4]   bude kony1
...ChildNodes.Nodes[5]   bude kony2
...ChildNodes.Nodes[6]   bude kony3


Ale to je (takhle pozdě) detail. Hlavně že víš, jak dostaneš do proměnné správný atribut
Poslal: Kony
« kdy: 14-11-2017, 23:32:44 »

jak si na to prisel ze bude 6ty ????

a mimo toho je tam tech odstavcu stejnych mraky.. jen se to meni prave v ton name... a potom se to rozlisuje... pro kazdy name je to jinaci
Poslal: rustymattock
« kdy: 14-11-2017, 23:31:19 »

Kony, dej tam zatim tenhle ošklivý kód (jelikož uznávám, že na to chceš jít úhledněji):

XMLDocument1.FileName := 'oscam.xml';
XMLDocument1.Active:=True;

Label1.Caption = XMLDocument1.DocumentElement.ChildNodes.Nodes[5].Attributes['name'];

Předpokládá to, že kony2 bude vždy v 6. node 'client', ale jestli opravdu bude, tak to to bude fungovat
Poslal: Kony
« kdy: 14-11-2017, 22:53:05 »

Dalsi napoveda :) Timto kodem hledas v node client subnode name:

Kód: Delphi [Vybrat]
  1. STitle := ANode.ChildNodes['name'].Text;

Coz by odpovidalo strukture jako je tato:

Kód: XML [Vybrat]
  1. <client>
  2.    <name>
  3.    </name>
  4. <client>

jak ten kod muze vedet ze ma na zacatku hledat v node Client a ne nekde jinde ???? to tam prece nikde neni urceny.. jenom tam je ze ma hledat "name"

co kdyz name bude jeste v nejaky jinaci instanci (odstavci-node)
Poslal: Kony
« kdy: 14-11-2017, 22:41:44 »

tyjo, tak tohle vazne nedavam....

potrebuju z kodu xml najit jmeno "kony2"

Kód: Delphi [Vybrat]
  1.  <client type="c" name="kony2" desc="" protocol="newcamd (generic)" protocolext="" au="0" thid="id_0x9e100b8">
  2.          <request caid="0D96" srvid="3397" ecmtime="27" ecmhistory="65,80,38,50,114,133,115,79,55,30,49,30,149,32,39,27" answered="bbb_skylink0D96 (cache)">Skylink: Dajto HD</request>
  3.          <times login="2017-11-03T18:05:31+0100" online="956821" idle="6"/>
  4.          <connection ip="vvv.vvv.vvv.vvv" port="49159">OK</connection>
  5.       </client>

a potom priradit
Kód: Delphi [Vybrat]
  1. Label1.Caption = 'kony2' //name
  2. Label2.Caption = 'newcamd (generic)' //protocol
  3. Label3.Caption = '"bbb_skylink0D96 (cache)">Skylink: Dajto HD' //answered
  4. Label4.Caption = 'vvv.vvv.vvv.vvv' //connection ip

uz to zkousim jak dlouho a porad nic
Poslal: Delfin
« kdy: 14-11-2017, 22:34:00 »

Dalsi napoveda :) Timto kodem hledas v node client subnode name:

Kód: Delphi [Vybrat]
  1. STitle := ANode.ChildNodes['name'].Text;

Coz by odpovidalo strukture jako je tato:

Kód: XML [Vybrat]
  1. <client>
  2.    <name>
  3.    </name>
  4. <client>

Ty chces ale cist hodnotu atributu toho node, tj.:

Kód: XML [Vybrat]
  1. <client name="root"><client>

Takze?

Kód: Delphi [Vybrat]
  1. STitle := ANode.?

Property Attributes
Poslal: Kony
« kdy: 14-11-2017, 22:19:55 »

no nejak me to dneska nemysli... cumim do toho jak husa do kamen....
Poslal: Delfin
« kdy: 14-11-2017, 22:17:01 »

ale ocividne to neni ono

Napoveda :):

Kód: XML [Vybrat]
  1. <node attribute="attribute value">node value</node>
Poslal: Kony
« kdy: 14-11-2017, 22:13:11 »

no je tohle docela dost obecny. mohl by si mi to prosim priblizit primo na muj pripad ????

zkousim tohle :

Kód: Delphi [Vybrat]
  1. var
  2.   RSS: string;
  3.   LocalRSS: TFileName;
  4.   StartItemNode: IXMLNode;
  5.   ANode: IXMLNode;
  6.   STitle, sDesc, sLink: widestring;
  7. begin
  8.   XMLDocument1.FileName := 'oscam.xml';
  9.   XMLDocument1.Active := True;
  10.   StartItemNode := XMLDocument1.DocumentElement.ChildNodes.First.ChildNodes.FindNode('name="kony2"');
  11.     ANode := StartItemNode;
  12.     repeat
  13.       STitle := ANode.ChildNodes['name'].Text;
  14.       sLink := ANode.ChildNodes['status'].Text;
  15.       sDesc := ANode.ChildNodes['protocol'].Text;
  16.       with ListView1.Items.Add do
  17.       begin
  18.         Caption := STitle;
  19.         SubItems.Add(sLink);
  20.         SubItems.Add(sDesc)
  21.       end;
  22.       ANode := ANode.NextSibling;
  23.     until ANode = nil;
  24. end;

ale ocividne to neni ono