MarkLogic SOAP响应处理

时间:2012-07-26 20:45:26

标签: marklogic

此MarkLogic XQuery将SOAP消息发布到CRM并以XML格式获取响应,请您帮助我在同一查询中实现以下内容:

  1. 我想使用MarkLogic Task Server每五分钟运行一次此查询。在下次运行之前,我必须解析最后一个响应并执行以下操作:
  2. a)如果在响应XML中我们看到结果/响应/代码[。= 200],则选择结果/响应/标题/日期并将其分配给XQuery的$ lastUpdateTime变量。否则$ lastUpdateTime不应该更新(以确保事务成功)。

    B)。我在MarkLogic数据库中有一个XML,其中包含id,first_name,last_name,phone,email标签。每次SOAP响应都会从CRM中获取更新的详细信息,即first_name,last_name,phone,email(其中ID是唯一标识符)。现在我必须循环遍历每个响应/项目,当id与ML DB的XML中存在的任何记录匹配时,我必须更新相应的first_name,last_name,phone,email。

    的XQuery:

    let $lastUpdateTime := xdmp:get-request-field("lastUpdateTime", "2012-07-23 09:26:03")
    
    let $payload := xdmp:quote(
        <SOAP-ENV:Envelope>
          <SOAP-ENV:Body>
            ....
          </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>
      )
    return
      let $createLogin := xdmp:http-post("http://localhost/SugarCE-Full-6.5.0/service/v2/soap.php/login")  
      let $payload2 := xdmp:quote(
          <SOAP-ENV:Envelope>
            <SOAP-ENV:Body>
              <query>date_modified >= '{$lastUpdateTime} AND deleted = 0'</query>
            </SOAP-ENV:Body>
          </SOAP-ENV:Envelope>)
      return
        xdmp:http-post("http://localhost/SugarCE-Full-6.5.0/service/v2/soap.php/login")
    

    响应:

    <?xml version="1.0" encoding="UTF-8"?>
    <results warning="more than one root item">
      <response xmlns="xdmp:http">
        <code>200</code>
        <message>OK</message>
        <headers>
          <date>Thu, 26 Jul 2012 19:33:58 GMT</date>      
        </headers>
      </response>
      <SOAP-ENV:Envelope>
        <SOAP-ENV:Body>
          <entry_list>
            <item xsi:type="tns:entry_value">
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">id</name>
              <value xsi:type="xsd:string">90cd7230-9fdd-20ae-9ad2-500dabecdb70</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">first_name</name>
              <value xsi:type="xsd:string">Jhon</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">last_name</name>
              <value xsi:type="xsd:string">Carter</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">email</name>
              <value xsi:type="xsd:string">jhone@carter.com</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">phone</name>
              <value xsi:type="xsd:string">99999999</value>
            </item>     
              </name_value_list>
            </item>
            <item xsi:type="tns:entry_value">
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">id</name>
              <value xsi:type="xsd:string">90cd7230-9fdd-20ae-9ad2-500dabecdb71</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">first_name</name>
              <value xsi:type="xsd:string">Jack</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">last_name</name>
              <value xsi:type="xsd:string">Sully</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">email</name>
              <value xsi:type="xsd:string">jack@sully.com</value>
            </item>
            <item xsi:type="tns:name_value">
              <name xsi:type="xsd:string">phone</name>
              <value xsi:type="xsd:string">8888888</value>
            </item>     
              </name_value_list>
            </item>    
            </item>
          </entry_list> 
          </SOAP-ENV:Body>
      </SOAP-ENV:Envelope>
    </results>
    

    现有的ML DB XML

    <?xml version="1.0" encoding="UTF-8"?>
    <Users>
        <user>
            <id>90cd7230-9fdd-20ae-9ad2-500dabecdb70</id>
            <firstName>Jhon</firstName>
            <lastName>Carter</lastName>
            <phone>999999999</phone>
            <email>abc@abc.com</email>
        </user>
        <user>
            <id>90cd7230-9fdd-20ae-9ad2-500dabecdb72</id>
            <firstName>Pankja</firstName>
            <lastName>Pankaj</lastName>
            <phone>88888</phone>
            <email>pankaj@pankaj.com</email>
        </user>
        <user>
            <id>90cd7230-9fdd-20ae-9ad2-500dabecdb78</id>
            <firstName>xyz</firstName>
            <lastName>abc</lastName>
            <phone>1111111</phone>
            <email>xyz@abc</email>
        </user>
    </Users>
    

    任何建议都会有很大的帮助。感谢。

1 个答案:

答案 0 :(得分:1)

首先,摆脱lastUpdateTime参数。例如,将该值存储在用户xml中作为根元素的属性,并在调用脚本后立即从那里读取它。每次更新用户XML时,都要扩展现有代码以更新该时间戳。

接下来,将脚本存储在您选择的数据库中。确保它是主xquery模块,而不是库模块。

最后,转到管理界面,打开您感兴趣的组,打开计划任务,然后在那里添加新任务。模块数据库应指向存储脚本的位置。任务根指的是该模块数据库中的路径前缀。你可以把它留给/保持简单。任务数据库应指向您存储用户XML的位置。

HTH!