2016-06-02 3 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)에서 시작해야합니다. 웹 서비스에 익숙하지 않은 것 같습니다. – Abelisto

답변

0

결국 나 자신이 답변을 찾았습니다. Thx 기여한 사람. 이것이 가장 우아한 방법이 아니라면, 그것은 잘 알고 있습니다. xml, onc 반환 문자열, 다른 하나의 배열을 통해 실행되는 함수를 구분했습니다.

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;      
관련 문제