迭代SOAP响应中的数据以存储在Excel工作表中

时间:2014-06-10 09:49:44

标签: web-services loops soap xquery soapui

我知道有一个DataLoop可用于迭代DataSource中的元素,但是如何迭代我正在提取到DataSink中的元素?

我有一个包含100条记录的SOAP响应,我需要从每条记录中提取不同的元素,并将数据存储在Excel工作表中。目前,我正在使用Property Transfer提取数据,并使用DataSink将其保存到电子表格中。下面是一个代码的示例,该代码在每个记录中获取第一个作者姓名并将其传输到DataSink(这在Property Transfer窗口的Source部分中):

declare namespace ns2='http://woksearch.v3.wokmws.thomsonreuters.com';
declare namespace ns1='http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord';

<full_name>
{
for $id in //ns1:name[1]//ns1:full_name[1]
return string($id)
}
</full_name>

但是,这会将每个记录中的所有名称作为列表,并将它们存储在Excel工作表中的单个单元格中(类似于我正在提取的其他数据字段)。如何将第一条记录的属性转移进入DataSink,然后迭代返回第二条记录的属性转移,依此类推,直到我迭代了所有100条记录?

感谢您的帮助!

约翰

  • 编辑:

以下是我试图从中检索数据的XML文档示例,我已经取出了一些元素,因为它非常长!:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
  <ns2:retrieveByIdResponse xmlns:ns2="http://woksearch.v3.wokmws.thomsonreuters.com">
    <return>
        <queryId>2</queryId>
        <recordsFound>100</recordsFound>
        <recordsSearched>50601246</recordsSearched>
        <records><records xmlns="http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord">
            <REC r_id_disclaimer="ResearcherID data provided by Thomson Reuters">    <UID>WOS:000266862400001</UID><static_data><summary><EWUID><WUID coll_id="WOS"></WUID><edition value="WOS.SCI"></edition><names count="3"><name seq_no="1" addr_no="1" role="author" reprint="Y"><display_name>Buijs, Arjen E.</display_name><full_name>Buijs, Arjen E.</full_name> ... etc ... </REC>
            <REC> ... etc ... </REC>
            <REC> ... etc ... </REC>
        </records></records>
     </return>
  </ns2:retrieveByIdResponse>
</soap:Body>
</soap:Envelope>

我提取的所有数据都位于这些<REC>代码中,因此我尝试从每个<full_name>中提取<REC>等字段,然后将其传递到Excel电子表格中。

我已经设法通过在此SOAP请求/响应之后使用DataSource步骤完全按照我的意愿显示数据,该步骤通过使用DataSource作为XML提取所有必需字段,然后引用行中每个的XPath和列部分。当我单击此窗口中的绿色测试按钮时,数据日志将显示所有100条记录,每个字段类型都有一列。但是,当我尝试将所有这些数据传递到DataSink时,它只会将第一行100次复制到Excel工作表中。

抱歉,我会发布截图,但你需要声望10+才能做到这一点!

  • 编辑2:

例如,对于字段<full_name>,我在DataSource中创建了一个名为Author 1的属性,设置为XML,Source Step是SOAP Request,Source Property是Response(列出的数据)上面的代码块)。在Row XPath中,我有:

declare namespace ns2='http://woksearch.v3.wokmws.thomsonreuters.com';
declare namespace ns1='http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord';
//ns2:retrieveByIdResponse[1]/return[1]/records[1]/ns1:records[1]/ns1:REC

在我的XPaths列中:

declare namespace ns1='http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord'; ns1:static_data/ns1:summary/ns1:names/ns1:name[1]/ns1:full_name/text()

当我在此窗口中运行测试时,会显示一个标题为“作者1”的列,然后列出100个不同的名称。但是,当我将其传输到DataSink时,它只在工作表中列出第一行100次。

2 个答案:

答案 0 :(得分:0)

您的查询会将所有名字放入一个名为full_name的XML元素中。但是我想你想要独立输出它们,但是你需要的就是:

declare namespace ns1 = 'http://scientific.thomsonreuters.com/schema/wok5.4/public/FullRecord';

//ns1:name[1]//ns1:full_name[1]

答案 1 :(得分:0)

你需要遵循这样的序列:

  1. SOAP调用以检索您的数据。
  2. 使用type = xml的DataSource来抓取所有记录,一次一个。
  3. DatasSink将每条记录写入Excel。
  4. 循环回#2以迭代所有记录。
相关问题