以编程方式编辑Sharepoint Wiki内容

以编程方式编辑Sharepoint Wiki内容,sharepoint,sharepoint-wiki,Sharepoint,Sharepoint Wiki,我希望以编程方式编辑Sharepoint Wiki内容。其优点之一是自动向Wiki环境添加索引 有人能做到这一点吗?语言并不重要,但正在寻找脚本解决方案 SharePoint wiki只是一种特殊类型的文档库。当我尝试这样做的时候,我遇到了一些奇怪的事情 SharePoint wiki页面由模板文件和列表项组成。查看页面时,列表项中的字段将插入模板文件。因此,要更新wiki页面,只需更新列表项中的正确字段。(顺便说一句,这也意味着您无法像获取普通文档库中的文件那样获取原始模板。到目前为止,我发现

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


有人能做到这一点吗?语言并不重要,但正在寻找脚本解决方案

SharePoint wiki只是一种特殊类型的文档库。当我尝试这样做的时候,我遇到了一些奇怪的事情

SharePoint wiki页面由模板文件和列表项组成。查看页面时,列表项中的字段将插入模板文件。因此,要更新wiki页面,只需更新列表项中的正确字段。(顺便说一句,这也意味着您无法像获取普通文档库中的文件那样获取原始模板。到目前为止,我发现获取模板本身的唯一方法是通过SharePoint Designer下载。)

此外,当您以编程方式访问列表项时,SharePoint会自动呈现wiki内容。因此,我无法获取包含“[[My Link Name]]”的内容,例如,SharePoint将始终返回呈现的HTML,如:

<A class=ms-wikilink href="/MyWikiLibrary/MyLinkName.aspx">My Link Name</A>


通过一些正则表达式的工作,您应该能够将其转换回原始的wiki内容。

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

我的资料来源:

  • (第1-6部分)
SP 2010和2007的服务代码几乎相同,但有几个注意事项:

  • 在2010年,不需要担心管理wiki链接标记(例如,[[括号]])
  • 在2007年,wiki标记会根据您的请求进行转换,因此您必须在发回之前将其重新转换为wiki标记。发回时,您不能使用UpdateListItems,必须使用复制服务。这是因为UpdateListItems将避开任何wiki标记,有效地使您的工作毫无用处
  • 在我们的环境中,我们要求在签入之前填写RecordType。也许这是标准的?如果不设置此字段,您的页面将保持签出状态。所以,我有一个条件设置这个字段为SP2007
  • 在2010年,SP在原始WikiField值中添加了一堆标记,如果缺少这些标记,可能会破坏布局。我只是在WLW发布的值周围插入它,然后在获取时去掉它。见下文
我使用第一个链接中的复制服务来创建和更新wiki页面。在2010年,您可以使用列表服务进行更新,但不能添加。 我使用图像服务将图像自动上传到图片库

以下是将“ms wikilinks”替换为wiki标记的函数:

注意:如果返回的标记格式不正确,我将使用HTMLAgilityPack。你也可以用正则表达式来做这个。我还使用Microsoft Anti-XSS 4.1库来清理标记

注意2:我的UrlDecode函数不依赖于System.Web

//
///Sharepoint 2007是mean,一旦页面保存在Sharepoint编辑器中,它将转换[[wiki链接]]。
///幸运的是,每个链接都用class=“ms wikilink”修饰并遵循一些约定。
/// 
/// 
/// 
私有静态字符串转换器主播ToWikilinks(此字符串为html)
{
HtmlDocument htmlDoc=新HtmlDocument();
htmlDoc.LoadHtml(html);
var anchorTags=(来自htmlDoc.DocumentNode.subjects()中的d)
其中d.Attributes.Contains(“类”)和&d.Attributes[“类”]。Value==“ms wikilink”
选择d).ToList();
foreach(锚具中的var锚)
{
//两种链接
//[[直接链接]]
//[[Wiki页面名称|显示名称]]
var wikiPageFromLink=UrlDecode(anchor.Attributes[“href”].Value.Split(“/”).LastOrDefault().Replace(“.aspx”,”);
var wikiPageFromText=anchor.InnerText;
HtmlNode textNode=null;
如果(wikiPageFromLink==wikiPageFromText)
{
//简单链接
textNode=HtmlTextNode.CreateNode(“[[”+wikiPageFromText+“]]”);
}
其他的
{
//替代链接
textNode=HtmlTextNode.CreateNode(String.Format(“[[{0}{1}]]”,wikiPageFromLink,wikiPageFromText));
}
if(textNode!=null)
{
anchor.ParentNode.ReplaceChild(textNode,anchor);
}
}
返回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;
    }
}
//
///从SharePoint HTML片段获取wiki页面的可编辑HTML。
/// 
/// 
/// 
公共静态字符串GetHtmlEditableContent(字符串html)
{
HtmlDocument htmlDoc=新HtmlDocument();
htmlDoc.LoadHtml(html);
HtmlNode divNode=(来自htmlDoc.DocumentNode.subjects()中的d)
其中d.Attributes.Contains(“class”)和&d.Attributes[“class”]。Value==“ms rte LayoutsOne内部”
选择d).FirstOrDefault();
HtmlNode divNode2=(来自htmlDoc.DocumentNode.subjects()中的d)
其中d.Attributes.Contains(“类”)和&d.Attributes[“类”].Value.StartsWith(“外部类”)
选择d).FirstOrDefault();
if(divNode!=null)
{
//SP 2010
返回divNode.InnerHtml;
}
else if(divNode2!=null)
{
//SP 2007还是别的什么
返回divNode2.InnerHtml.convertAnchorToWikilinks();
}
其他的
{
返回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;
}
//
///在wiki页面内容周围插入SharePoint的包装HTML。愚蠢的
/// 
/// 
/// 
公共静态字符串insertSharePointHtmlRapper(字符串html,SharePointVersion spVersion)
{
//2007年没有奇怪的HTML包装
如果(spVersion==SharePointVersion.SP2007)
返回Microsoft.Security.Application.Sanitizer.GetSafeThmlFragment(h
/// <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;
}