2016-06-02 4 views
1

私はfreepascal xmlチュートリアルや投稿がたくさんあることを知っていますが、これまでのところ私は仕事をしてくれないようです。 私はAPI経由でOdooに接続し、データを取得し、処理し、対応するLazarusデスクトップアプリケーションを構築しています。 xmlレスポンスの構造は、(少なくとも私にとっては)非常に扱いにくいです。 例応答は次のとおりです。XML-RPC with 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> 

問題は値が一意のタグなしである、またはIDのことです。 私がしようとしているのは、名前で値にアクセスすることです。私が直面している問題は、値などのIDがなく、配列の一部であるということです。 私は

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

にしようとしているが、これは構造が変化した場合に失敗し、本当に考慮に配列を取ることはありません。 助けていただければ幸いです。

+0

これはファイルではありませんが、Odooサーバーのxml-rpc応答はストリームです。私はそれを印刷可能なテキストとして取り込み、その例は上記のとおりです。 – Dawid

+0

私は知っています。 FWIW、あなたの返信を見る前に私のコメントを削除しました。 –

+0

おそらくあなたは[Web Service Toolkit](http://wiki.freepascal.org/Web_Service_Toolkit)から始めるべきです。私はWebサービスに精通していません。 – Abelisto

答えて

0

結局私は自分自身で答えを見つけました。 Thx貢献した人。 これを行う最もエレガントな方法でないなら、私は知っている、それは仕事を行う。 私は、xml、onc、string、その他の1つの配列を返す関数を別々にしました。

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;      
関連する問題