2016-06-02 20 views
1

Ich weiß, es gibt viele Freepascal Xml-Tutorials und Posts, aber nichts, was ich bis jetzt gefunden habe scheinen die Arbeit für mich zu tun. Ich baue Lazarus Desktop-App, um über die API mit Odoo zu verbinden, einige Daten zu erhalten, zu verarbeiten und zu antworten. Die Struktur der XML-Antwort ist ziemlich schwierig (zumindest für mich) zu arbeiten. Das Beispiel Antwort ist:XML-RPC mit Lazarus freepascal

<?xml version='1.0'?> 
<methodResponse> 
    <params> 
    <param> 
     <value> 
     <array> 
      <data> 
      <value> 
       <struct> 
       <member> 
        <name>create_date</name> 
        <value> 
        <string>2016-03-30 09:05:23</string> 
        </value> 
       </member> 
       <member> 
        <name>file_name</name> 
        <value> 
        <string>O156AP000100</string> 
        </value> 
       </member> 
       <member> 
        <name>dispatch_date</name> 
        <value> 
        <string>2016-04-04</string> 
        </value> 
       </member> 
       <member> 
        <name>height</name> 
        <value> 
        <int>0</int> 
        </value> 
       </member> 
       <member> 
        <name>custom_option_mapping_ids</name> 
        <value> 
        <array> 
         <data /> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>message_ids</name> 
        <value> 
        <array> 
         <data /> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>message_summary</name> 
        <value> 
        <string /> 
        </value> 
       </member> 
       <member> 
        <name>create_uid</name> 
        <value> 
        <array> 
         <data> 
         <value> 
          <int>7</int> 
         </value> 
         <value> 
          <string>My 1st years</string> 
         </value> 
         </data> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>display_name</name> 
        <value> 
        <string>artwork.job,283</string> 
        </value> 
       </member> 
       <member> 
        <name>message_is_follower</name> 
        <value> 
        <boolean>1</boolean> 
        </value> 
       </member> 
       <member> 
        <name>production_date</name> 
        <value> 
        <boolean>0</boolean> 
        </value> 
       </member> 
       <member> 
        <name>message_last_post</name> 
        <value> 
        <boolean>0</boolean> 
        </value> 
       </member> 
       <member> 
        <name>id</name> 
        <value> 
        <int>283</int> 
        </value> 
       </member> 
       <member> 
        <name>width</name> 
        <value> 
        <int>0</int> 
        </value> 
       </member> 
       <member> 
        <name>file_path</name> 
        <value> 
        <string>2016-04-04/Table Rate/1</string> 
        </value> 
       </member> 
       <member> 
        <name>text_colour</name> 
        <value> 
        <array> 
         <data> 
         <value> 
          <int>489</int> 
         </value> 
         <value> 
          <string>Text Colour: Fuchsia Pink</string> 
         </value> 
         </data> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>text_lines</name> 
        <value> 
        <array> 
         <data> 
         <value> 
          <int>1686</int> 
         </value> 
         <value> 
          <int>16380</int> 
         </value> 
         </data> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>sale_order_id</name> 
        <value> 
        <array> 
         <data> 
         <value> 
          <int>368</int> 
         </value> 
         <value> 
          <string>SO156</string> 
         </value> 
         </data> 
        </array> 
        </value> 
       </member> 
       <member> 
        <name>text_font</name> 
        <value> 
        <array> 
         <data> 
         <value> 
          <int>492</int> 
         </value> 
         <value> 
          <string>Font: Verdana</string> 
         </value> 
         </data> 
        </array> 
        </value> 
       </member> 
       </struct> 
      </value> 
      </data> 
     </array> 
     </value> 
    </param> 
    </params> 
</methodResponse> 

Das Problem ist, dass die Werte ohne eindeutige Tags sind oder IDs. Was ich versuche, ist der Zugriff auf Werte mit ihren Namen. Das Problem, dem ich gegenüberstehe, ist, dass es keine IDs für die Werte usw. gibt und einige Teile Arrays sind. Ich habe versucht, mit

variables:= Doc.DocumentElement.GetElementsByTagName('member'); 
fname:=variables[3].FindNode('value').TextContent; 

aber das wird, wenn Strukturänderungen scheitern und nicht wirklich Arrays berücksichtigt. Jede Hilfe wird geschätzt.

+0

Es ist keine Datei, aber Odoo Server xml-rpc Antwort so Stream. Ich nehme es als druckbaren Text auf und das Beispiel ist oben. – Dawid

+0

Ich weiß. FWIW, ich habe meinen Kommentar gelöscht, bevor ich deine Antwort gesehen habe. –

+0

Wahrscheinlich sollten Sie bei [Web Service Toolkit] starten (http://wiki.freepascal.org/Web_Service_Toolkit) Ich bin nicht vertraut mit Web-Services, nur eine Vermutung. – Abelisto

Antwort

0

Immerhin habe ich selbst eine Antwort gefunden. Thx jeder, der dazu beigetragen hat. Ich weiß, wenn es nicht die eleganteste Art ist, dies zu tun, macht es den Job aber. Ich habe gemacht, um Funktionen zu trennen, die durch das XML laufen, ONC, der Zeichenkette, anderes ein Array zurückbringt.

type 
TStringArray = array of string; 

... 

    public 
function extractVar(Doc1: TXMLDocument; searchvar:string): String; 
function extractArray(Doc1: TXMLDocument; searchvar:string): TStringArray; 

... 

var 
textLines: TStringArray; 

... 

function TAThread.extractArray(Doc1: TXMLDocument; searchvar:string): TStringArray; 
var 
c,v:integer; 
Name,value:string; 
myNodes: TDOMNodeList; 
subNodes: TDOMNodeList; 
begin 
c:=0; 
    try 
    myNodes:= Doc1.DocumentElement.GetElementsByTagName('member'); 
    for c:=0 to myNodes.Count-1 do 
    begin 
     Name:= myNodes[c].FindNode('name').TextContent; 
     if (Name=searchvar) then begin 
     try 
      subNodes:= myNodes[c].GetChildNodes; 
      subNodes:= subNodes[1].GetChildNodes; 
      subNodes:= subNodes[0].GetChildNodes; 
      subNodes:= subNodes[0].GetChildNodes; 
      v:=0; 
      SetLength(Result, subNodes.Count); 
      for v:=0 to subNodes.Count-1 do 
      begin 
      Result[v]:= subNodes[v].TextContent; 
      end; 

      finally 
      subNodes.Free; 
      end; 
     end; 
     end; 
    finally 
    myNodes.Free; 
    end; 
end; 

function TAThread.extractVar(Doc1: TXMLDocument; searchvar:string): String; 
var 
c:integer; 
Name:string; 
myNodes: TDOMNodeList; 
begin 
c:=0; 
    try 
    myNodes:= Doc1.DocumentElement.GetElementsByTagName('member'); 
    for c:=0 to myNodes.Count-1 do 
    begin 
    Name:= myNodes[c].FindNode('name').TextContent; 
    if (Name=searchvar) then begin 
     result:= myNodes[c].FindNode('value').TextContent; 
    end; 
    end; 
    finally 
    myNodes.Free; 
    end; 
end;