Autor Téma: nacteni XML stranky a rozparcovani  (Přečteno 255 krát)

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
nacteni XML stranky a rozparcovani
« kdy: 14-11-2017, 21:35:29 »
hoj, potreboval bych natahnout stranku xml ve formatu http://xxx.xxx.xxx.xxx:10001/oscamapi.html?part=status

pomoci teto stranky se natahne XML ve formatu

Kód: Delphi [Vybrat]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <oscam version="1.20-unstable_svn build r10347" revision="10347" starttime="2017-11-03T18:05:21+0100" uptime="956831" readonly="0">
  3.  
  4.         <status>
  5.       <client type="s" name="root" desc="" protocol="server" protocolext="" au="0" thid="id_0x9a61408">
  6.          <request caid="0000" srvid="0000" ecmtime="" ecmhistory="" answered=""/>
  7.          <times login="2017-11-03T18:05:21+0100" online="956831" idle="8"/>
  8.          <connection ip="127.0.0.1" port="0">OK</connection>
  9.       </client>
  10.       <client type="h" name="root" desc="" protocol="http" protocolext="" au="0" thid="id_0xb7200468">
  11.          <request caid="0000" srvid="0000" ecmtime="" ecmhistory="" answered=""/>
  12.          <times login="2017-11-03T18:05:21+0100" online="956831" idle="48"/>
  13.          <connection ip="127.0.0.1" port="0">OK</connection>
  14.       </client>
  15.       <client type="p" name="gaaa_upc" desc="" protocol="newcamd" protocolext="" au="-1" thid="id_0x9b93fc0">
  16.          <request caid="0D97" srvid="7606" ecmtime="155" ecmhistory="199,170,388,155,164,323,156,293,155,398,153,179,345,307,186,155" answered="">freeSAT: 0D97:7606 unknown</request>
  17.          <times login="2017-11-03T18:05:22+0100" online="956830" idle="0"/>
  18.          <connection ip="aaa.aaa.aaa.aaa" port="34000">CONNECTED</connection>
  19.       </client>
  20.       <client type="c" name="kony1" desc="" protocol="newcamd (OSCam)" protocolext="" au="-1" thid="id_0x9d36468">
  21.          <request caid="0D97" srvid="7921" ecmtime="155" ecmhistory="162,156,163,158,156,158,159,158,156,155,157,157,156,170,155,155" answered="aaa_upc">freeSAT: Discovery Showcase HD</request>
  22.          <times login="2017-11-03T18:05:28+0100" online="956824" idle="3"/>
  23.          <connection ip="yyy.yyy.yyy.yyy" port="40738">OK</connection>
  24.       </client>
  25.       <client type="c" name="kony2" desc="" protocol="newcamd (generic)" protocolext="" au="0" thid="id_0x9e100b8">
  26.          <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>
  27.          <times login="2017-11-03T18:05:31+0100" online="956821" idle="6"/>
  28.          <connection ip="vvv.vvv.vvv.vvv" port="49159">OK</connection>
  29.       </client>
  30.       <client type="c" name="kony3" desc="" protocol="newcamd (vdr-sc)" protocolext="" au="0" thid="id_0x9ebb0b0">
  31.          <request caid="0D96" srvid="3398" ecmtime="78" ecmhistory="88,59,86,75,60,205,87,98,113,94,42,84,109,87,99,78" answered="bbb_skylink0D96 (cache)">Skylink: Joj HD</request>
  32.          <times login="2017-11-03T18:05:49+0100" online="956803" idle="8"/>
  33.          <connection ip="eee.eee.eee.eee" port="57713">OK</connection>
  34.       </client>

tak aby se mi rozhazeli tyto informace do Label.textu

kdyz zadam do Edit.Text "Kony1"  tak aby se mi do Label1.Caption hodil "kony1" z udaju name="kony1", potom do Label2.Caption hodil " newcamd (OSCam)" z udaje protocol="newcamd (OSCam)", label3.Caption se nahodil <connection ip="eee.eee.eee.eee" atd

diky moc za radu, samozrejme pokud by to neslo online ze by se to davalo do streamu, tak neni xml soubor predukladat na disk

rustymattock

  • Host
Re:nacteni XML stranky a rozparcovani
« Odpověď #1 kdy: 14-11-2017, 22:07:54 »
Nedávno jsem XML docela výživně pitval. Ovšem z HD, ne online.

uses
  Xml.xmldom, Xml.XMLIntf, Xml.XMLDoc

procedure BlaBla;
var
  XMLDoc:IXMLDocument;
begin
  XMLDoc:=LoadXMLDocument(tvoje adresa); //nikdy jsem to netahal online, nevím, zda se to chová stehjně, jako z HD
  Edit.Text:=XMLDoc.DocumentElement.ChildNodes.Nodes[poradové číslo tvého 'client' uzlu].Attributes['Name'];   //jelikož máš více uzlů se stejným názvem, hledáš ten svůj dle indexu a ne podle jména
...

...a pozor, názvy uzlů a atributů jsou CaseSensitive.

Nevím, zda jsi chtěl tohle.

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #2 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

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 355
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:nacteni XML stranky a rozparcovani
« Odpověď #3 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>
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #4 kdy: 14-11-2017, 22:19:55 »
no nejak me to dneska nemysli... cumim do toho jak husa do kamen....

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 355
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:nacteni XML stranky a rozparcovani
« Odpověď #5 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
« Poslední změna: 14-11-2017, 22:36:19 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #6 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
« Poslední změna: 14-11-2017, 22:46:29 od Kony »

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #7 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)
« Poslední změna: 14-11-2017, 22:54:52 od Kony »

rustymattock

  • Host
Re:nacteni XML stranky a rozparcovani
« Odpověď #8 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

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #9 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
« Poslední změna: 14-11-2017, 23:37:19 od Kony »

rustymattock

  • Host
Re:nacteni XML stranky a rozparcovani
« Odpověď #10 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

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #11 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

rustymattock

  • Host
Re:nacteni XML stranky a rozparcovani
« Odpověď #12 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 ?

rustymattock

  • Host
Re:nacteni XML stranky a rozparcovani
« Odpověď #13 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;

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:nacteni XML stranky a rozparcovani
« Odpověď #14 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.. ??

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: