8

我正在尝试使用 Lists.UpdateListItems Web 服务更新 SharePoint 托管元数据 (MMD) 字段,但它不起作用。

这是我的 SOAP 请求

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
  <UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
    <listName>My Test List</listName>
    <updates>
      <Batch ListVersion="0" PreCalc="TRUE" OnError="Continue">
        <Method Cmd="Update" ID="1">
          <Field Name="ID">3</Field>
          <Field Name="Document_x0020_Title">foo</Field>
          <Field Name="Fiscal_x0020_Year1">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field>
        </Method>
      </Batch>
    </updates>
   </UpdateListItems>
</S:Body></S:Envelope>

此请求将成功更新“文档标题”(文本字段),但 MMD 字段“会计年度”未更改,并且 Web 服务没有返回错误。

请注意,MMD 的值采用“WssId;#TermValue|TermGuid”格式,并且已经为站点创建了术语。

请帮忙。

4

2 回答 2

10

弄清楚了。

我必须使用不同的字段名称。该字段的标签是“会计年度”,但有效的字段名称实际上是“d3c0ddc947ab4b8c90b6a0fe2d4caf09”而不是“Fiscal_x0020_Year1”。所以我的 SOAP 请求看起来像

    <Method Cmd="Update" ID="1">
      <Field Name="ID">3</Field>
      <Field Name="Document_x0020_Title">foo</Field>
      <Field Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field>
    </Method>

要获取此字段名称,我使用 Lists.GetListContentType Web 服务方法返回字段信息并查找字段类型“Note”。以下是 SharePoint 返回的示例

<Field Type="Note" DisplayName="Fiscal Year_0"
StaticName="d3c0ddc947ab4b8c90b6a0fe2d4caf09" Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09" 
ID="{1afa458b-d50a-4139-ad8d-f1172774de34}" ShowInViewForms="FALSE" Required="FALSE" 
CanToggleHidden="TRUE" SourceID="{77871b4e-f3ba-42dc-8940-ab33fb431099}" Hidden="TRUE" 
Version="1" Customization="" ColName="ntext8" RowOrdinal="0"/>

我还发现使用 Lists.GetListContentTypes 方法来获取 Lists.GetListContentType 方法调用中使用的内容类型 ID 很有用。

----更新-- 我发现你不必使用“WssId;#TermValue|TermGuid”的格式。您可以简单地使用“TermValue|TermGuid”。因此,在上面的示例中,该值将是“FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8”。

这非常有用,因为您可以在不同的站点上重复使用相同的值,这与以前的值不同,您只能在一个站点中使用它。对于多值,您只需要用“;”分隔它 代替 ”;#”。例如“2006 财年|7e8205da-57a1-45a3-8147-469b795ad6e8;2007 财年|823205da-57a1-45a3-8147-469b795ade13”。

于 2012-07-11T14:01:10.053 回答
1

感谢您提及有关 StaticName 的内容。这结束了我的痛苦。

似乎对于不链接到 MMS 的简单字段(如 Title),允许使用更惰性的更新语法。例如,就它自己而言,处理以下更新时不会出现错误。

<Field Name="Title">Some Title</Field>

但是,链接到 MMS 的字段的规则并不相同。
按照上面的方法,我进入了我的彩信领域。如果您通过其友好名称识别该类型的字段并输入一个整数,则可以使用任意值更新该类型的字段,例如:

<Field Name="Activity">20</Field>

“20”只是翻译成某个术语。
我尝试了很多数字,它们都以同一个词的形式出现。

或者,如果我更接近记录的更新值的方式,同时仍用“活动”标识字段,则服务返回错误 0x80020005。

<Field Name="Activity">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field>

所以不要那样做。
只有当卫星完全对齐时,我才能找到成功。StaticName 是关键

<Field Name="j06a8d8240f84aec987f6a28effa3ae1">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field>

查找 StaticName 的另一种方法是在对 GetList 请求的响应中查找每个 MMS 字段的字段类型=“注释”。此操作比 GetListContentType 少 1 个输入。您只需要列表名称而不需要 contentTypeID。

摇滚吧。

于 2013-12-12T17:44:20.557 回答