我正在尝试使用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”格式,并且已为该站点创建术语。
请帮忙。
答案 0 :(得分: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”。
这非常有用,因为您可以在不同的站点重用相同的值,而不像以前的值,您只能在一个站点中使用它。对于多值,您只需要用“;”分隔它代替 ”;#”。例如“FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8; FY 2007 | 823205da-57a1-45a3-8147-469b795ade13”。
答案 1 :(得分:0)
感谢您提及有关StaticName的信息。这结束了我的痛苦。
对于简单字段,似乎没有链接到MMS,如Title,允许更懒惰的更新语法。例如,在它自己的情况下,处理以下更新时没有错误。
<Field Name="Title">Some Title</Field>
但是,与MMS相关联的字段的规则并不相同 按照上面的方法,我进入了我的MMS领域。如果您通过友好名称识别并输入整数,则可以使用任意值更新该类型的字段,例如:
<Field Name="Activity">20</Field>
“20”只是转换为某个术语 我尝试了很多数字,他们都回到了同一个词。
或者,如果我更接近记录的更新值的方法,同时仍然使用“Activity”标识字段,则服务返回错误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字段的Field Type =“Note”。此操作比GetListContentType少输入1。您只需要列表名称而不是contentTypeID。
摇滚。