2016-06-02 2 views
1

Я знаю, что есть много бесплатных учебных пособий и сообщений freepascal xml, но ничего, что я нашел до сих пор, похоже, не выполняет эту работу для меня. Я создаю приложение Lazarus для подключения через API к Odoo, получаю некоторые данные, обрабатываю и отвечаю. Структура ответа xml довольно сложна (по крайней мере для меня) для работы. Пример ответ:XML-RPC с 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> 

Проблема заключается в том, что значения не имеют уникальных тегов, или идентификаторы. То, что я пытаюсь сделать, - это получить доступ к значениям по их именам. Проблема, с которой я сталкиваюсь, заключается в том, что для значений нет идентификаторов, а некоторые - массивы. Я пытался с

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

, но это не сработает, если изменения структуры и на самом деле не принимать во внимание массивы. Любая помощь будет оценена по достоинству.

+0

Это не файл, а реакция сервера xp-rpc сервера Odoo, поэтому поток. Я собираю его как печатный текст, и пример выше. – 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;      
Смежные вопросы