以编程方式编辑 Sharepoint Wiki 内容

2024-01-07

我想以编程方式编辑我的 Sharepoint Wiki 内容。优点之一是自动向 Wiki 环境添加索引。

有人能够做到这一点吗?语言并不重要,重要的是寻找脚本解决方案。


是的。我推出了自己的 Metaweblog API,以编程方式管理 Sharepoint 2010 和 2007 中的 wiki 页面。

我的资料来源:

  • http://sites.google.com/site/sharepointwikiuploader/ http://sites.google.com/site/sharepointwikiuploader/
  • http://blogs.msdn.com/b/dwinter/archive/2008/06/28/migration-wiki-pages-remotely-part-01.aspx http://blogs.msdn.com/b/dwinter/archive/2008/06/28/migrating-wiki-pages-remotely-part-01.aspx(第 1 - 6 部分)

SP 2010 和 2007 的服务代码几乎相同,但有一些注意事项:

  • 在 2010 年,无需担心管理 wiki 链接标记(例如 [[brackets]])。
  • 2007 年,Wiki 标记会根据您的请求进行转换,因此您必须在发回之前将其重新转换为 Wiki 标记。发回后,您cannot使用UpdateListItems,必须使用Copy服务。这是因为 UpdateListItems 会转义任何 wiki 标记,从而有效地使您的努力毫无用处。
  • 在我们的环境中,我们需要记录类型在办理入住前填写。也许这是标准的?如果您不设置此字段,您的页面将保持签出状态。因此,我有一个为 SP2007 设置此字段的条件。
  • 2010 年,SP 在原始 WikiField 值中添加了一堆标记,如果缺少它可能会弄乱布局。我只是将它插入到 WLW 发布的值周围,然后在获取时将其删除。见下文。

我使用第一个链接中的复制服务来创建和更新 wiki 页面。 2010年,你can使用列表服务进行更新,但不进行添加。 我使用图像服务将图像自动上传到图片库。

这是一个将“ms-wikilinks”替换为 wiki 标记的函数:

Note:我使用 HTMLAgilityPack 以防返回的标记格式错误。您也可以使用正则表达式来执行此操作。我还使用 Microsoft Anti-XSS 4.1 库来清理标记。

Note 2:我的 UrlDecode 函数不依赖于 System.Web,取自这里 http://csharpfeeds.com/post/10343/Html_and_Uri_String_Encoding_without_System.Web.aspx.

/// <summary>
/// Sharepoint 2007 is mean and converts [[wiki links]] once the page is saved in the Sharepoint editor.
/// Luckily, each link is decorated with class="ms-wikilink" and follows some conventions.
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
private static string ConvertAnchorsToWikiLinks(this string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(html);

    var anchorTags = (from d in htmlDoc.DocumentNode.Descendants()
                      where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-wikilink"
                      select d).ToList();

    foreach (var anchor in anchorTags)
    {
        // Two kinds of links
        // [[Direct Link]]
        // [[Wiki Page Name|Display Name]]
        var wikiPageFromLink = UrlDecode(anchor.Attributes["href"].Value.Split('/').LastOrDefault().Replace(".aspx", ""));
        var wikiPageFromText = anchor.InnerText;

        HtmlNode textNode = null;

        if (wikiPageFromLink == wikiPageFromText)
        {
            // Simple link
            textNode = HtmlTextNode.CreateNode("[[" + wikiPageFromText + "]]");
        }
        else
        {
            // Substituted link
            textNode = HtmlTextNode.CreateNode(String.Format("[[{0}|{1}]]", wikiPageFromLink, wikiPageFromText));
        }

        if (textNode != null)
        {
           anchor.ParentNode.ReplaceChild(textNode, anchor);
        }
    }

    return htmlDoc.DocumentNode.InnerHtml;
}

剥离SharePoint HTML 的函数是:

/// <summary>
/// Gets editable HTML for a wiki page from a SharePoint HTML fragment.
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string GetHtmlEditableContent(string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(html);

    HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants()
                        where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner"
                        select d).FirstOrDefault();
    HtmlNode divNode2 = (from d in htmlDoc.DocumentNode.Descendants()
                         where d.Attributes.Contains("class") && d.Attributes["class"].Value.StartsWith("ExternalClass")
                         select d).FirstOrDefault();

    if (divNode != null)
    {
        // SP 2010
        return divNode.InnerHtml;
    }
    else if (divNode2 != null)
    {
        // SP 2007 or something else
        return divNode2.InnerHtml.ConvertAnchorsToWikiLinks();
    }
    else
    {
        return null;
    }
}

最后,将标记全部添加回来的函数:

/// <summary>
/// Inserts SharePoint's wrapping HTML around wiki page content. Stupid!
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string InsertSharepointHtmlWrapper(string html, SharePointVersion spVersion)
{
    // No weird wrapper HTML for 2007
    if (spVersion == SharePointVersion.SP2007)
        return Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html);

    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.LoadHtml(@"<table id='layoutsTable' style='width:100%'>
                            <tbody>
                                <tr>
                                    <td>
                                        <div class='ms-rte-layoutszone-outer' style='width:99.9%'>
                                            <div class='ms-rte-layoutszone-inner' style='min-height:60px;word-wrap:break-word'>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <span id='layoutsData' style='display:none'>false,false,1</span>");

    HtmlNode divNode = (from d in htmlDoc.DocumentNode.Descendants()
                        where d.Attributes.Contains("class") && d.Attributes["class"].Value == "ms-rte-layoutszone-inner"
                        select d).FirstOrDefault();

    divNode.InnerHtml = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(html);

    return htmlDoc.DocumentNode.InnerHtml;
}

这很好用。

  • 页面仍然保留最后修改和正确的用户
  • 页面将保留其所有历史记录
  • 页面更易于管理

我正在考虑发布我的 API,这并不是很多代码,我认为对于我们这些想要更好地管理 Sharepoint wiki 的人来说非常有帮助。通过 WLW,我可以获得自动图像上传、更好的 HTML 编辑支持以及对 PreCode Snippet 等插件的支持。这很棒!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式编辑 Sharepoint Wiki 内容 的相关文章

  • 如何将 Web 部件页面添加到站点定义?

    我必须为必须包含预定义 Web 部件页面的客户端创建站点定义 我可以创建 Web 部件页面 但在创建时将它们附加到网站时却不知所措 我知道通过 SharePoint 创建的 Web 部件页面存储在文档库中 我是否需要预先填充 Web 部件页
  • 如何将我的代理凭据传递给 SharePoint 客户端上下文对象...? (SharePoint 客户端对象模型)

    我正在编写一个使用客户端对象模型访问 SharePoint 网站的应用程序 并且我位于代理服务器后面 我打电话 ClientContext ExecuteQuery 并收到以下错误消息 远程服务器返回错误 407 需要代理身份验证 如何将我
  • 使用批处理文件或 .NET 代码更改 Web.config 中的值

    我的计算机上有一个 web config 文件 我需要在文件中更改和添加很多内容 我实际上正在使用我的 SharePoint web config 文件 我可以用批处理文件来执行此操作吗 如果可以 我该怎么做 或者我如何使用 VB NET
  • 手动启动 SharePoint 计时器作业

    我想手动调用安装在 SharePoint 服务器上的计时器作业 有用的是类似于 stsadm 命令的东西 我的场景是 我已将具有大量功能的解决方案部署到客户服务器 我不想等待每周的时间表来启动特定的计时器工作 我想输入一个命令来立即运行特定
  • 如何仅为具有特定模板 ID 的列表添加事件接收器

    我正在为自定义列表模板添加 ItemAdding 事件接收器 事件接收器和列表模板都是由相同的功能部署的 同样的功能还可以创建列表实例 我遇到的问题是该事件是为每个列表项触发在其部署的地点 eventreceivre 的 Elements
  • 使用 Active Directory 验证 Sharepoint?

    只需要找到一种简单的方法来让 AD 进行身份验证作为 Sharepoint 站点的登录名 这相当快速和简单地开始吗 Thanks 对于 SharePoint 2007 请参阅此article http technet microsoft c
  • 如何在 asp.net 中用空字符串替换字符串中的任何“/ \\ [ ] : | < > + = ; , ? *”字符

    我想用 asp net c 中的空字符串替换字符串中出现的任何以下字符 我正在尝试将其替换为 mystring contains mystring Replace 目前我正在按照上面的方法进行 有没有更干净的方法来做到这一点 感谢致敬 有很
  • 为 SharePoint 2010 Web 部件创建图表

    我已创建从 Web 部件到 Oracle 数据库的连接 其中包含日期和数字 我想在图表中显示这些数据 我在互联网上查找过任何示例 但我很困惑 任何人都可以向我指出一些简单的说明 详细说明如何在 C Sharp 中创建可在 Web 部件上使用
  • 使用 JS 从 SharePoint 日历中检索事件编号

    我有一个 SharePoint 日历列表 并且正在寻找一个脚本来检索一天的事件数 例如 今天 即 8 月 10 日 我只想检索日历中存储的事件数 任何建议都会非常有帮助 在 JavaScript 中查询日历的问题 重复 通常 使用 REST
  • 反向代理受 NTLM 保护的网站

    如何将请求代理到受 NTLM 保护的网站 例如团队基金会 and 共享点 我不断得到401 身份验证错误 根据这篇 Microsoft TechNet 文章 https www microsoft com technet prodtechn
  • 活动工作流程与运行工作流程

    本周末在伊利诺伊州莱尔举行的 SharePoint Saturday 活动上 Robert Bogue 表示活动工作流和正在运行的工作流之间存在差异 我在网上查了一下 有人能解释一下吗 如果服务器上可以有多达数百万个活动工作流程 为什么每台
  • sharepoint:使用内容编辑器 Web 部件时发生此错误:“此时无法检索属性。”

    我有一个内容编辑器 Web 部件 每当我编辑内容然后单击保存时 都会出现以下错误 Cannot retrieve properties at this time Cannot save your changes 你如何解决这个问题 我尝试用
  • 从共享点下载文件

    我正在尝试从共享点下载文件 我有此代码并抛出错误代码 500 static void DownloadFile string serverFilePath Here goes my URL that open the file from a
  • 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    我们有一个 SQL Server 2008 数据库 它有存储过程来处理读 写等 这些过程由各种应用程序内部使用 需要一个人直接更新数据库中名为 Employee 的表 更新非常简单 更新 VARCHAR 和 INT 外键 字段 问题是 Sh
  • SSIS-从 Sharepoint 下载 Excel 并将其加载到 SQL 数据库

    我目前遇到的情况是共享点网站上有一个 Excel 文件 我需要将该 Excel 文件加载到数据库中 Excel 文件有多个工作表 我尝试过以下方法 但运气为零 方法 1 我访问 sharepoint 站点并访问 库 选项卡 并选择使用资源管
  • 如何在网站上重新创建电子表格或共享点数据表视图?

    我正在尝试将用户从共享点解决方案迁移到网站 SQL 后端 一件事是每个人似乎都喜欢共享点视图和数据表视图来编辑和管理信息 什么是最好的电子表格 访问数据编辑解决方案 是否有任何第三方 ASP NET MVC 小部件是很好的替代品 Teler
  • 使用 Microsoft Graph API 从 Sharepoint 站点提取 Excel.xlsx 工作簿

    正如标题中所述 我一直在尝试使用 Microsoft Graph API 从我们公司的 Sharepoint 站点提取 Excel 工作簿 我能够检索文件的元数据 但是当我添加 workbook 分段到 URL 我收到以下错误 error
  • Microsoft.SharePoint.ApplicationPages 上的访问被拒绝

    在我们的 MOSS Enterprise 环境中 我们遇到了一个奇怪的问题 人们在尝试创建新网站集或导航到 mysite 时有时会收到此错误消息 无法加载文件或程序集 Microsoft SharePoint ApplicationPage
  • python 3 suds 缓存不工作

    我正在尝试编写一个通过 Python 访问 Sharepoint 的脚本 已安装以下库 suds jurko ntlm 以下代码成功 但需要接近 20 秒 usr bin env python3 from suds client impor
  • SharePoint Online 身份验证失败

    我有一个 C 应用程序 它通过使用 Web 请求对 SharePoint Online 进行身份验证 它对我来说非常有用 但其他人收到以下错误

随机推荐