此MarkLogic XQuery将SOAP消息发布到CRM并以XML格式获取响应,请您帮助我在同一查询中实现以下内容:
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>
任何建议都会有很大的帮助。感谢。
答案 0 :(得分:1)
首先,摆脱lastUpdateTime
参数。例如,将该值存储在用户xml中作为根元素的属性,并在调用脚本后立即从那里读取它。每次更新用户XML时,都要扩展现有代码以更新该时间戳。
接下来,将脚本存储在您选择的数据库中。确保它是主xquery模块,而不是库模块。
最后,转到管理界面,打开您感兴趣的组,打开计划任务,然后在那里添加新任务。模块数据库应指向存储脚本的位置。任务根指的是该模块数据库中的路径前缀。你可以把它留给/保持简单。任务数据库应指向您存储用户XML的位置。
HTH!