使用其 API 向 OneNote 添加内容时,“该部分是只读的”

本文关键字:该部 只读 API OneNote 添加 | 更新日期: 2023-09-27 18:30:51

目前,我正在尝试使用Microsoft.Office.Interop.OneNote引用提供的 OneNote API 中的UpdatePageContent函数向 OneNote 2013 页面添加内容。但是,我总是得到错误代码0x80042001,这在文档中被描述为 XML 无效。但是,我不明白出于什么原因,以下简单代码中的XML无效。

using System;
using OneNote = Microsoft.Office.Interop.OneNote;
namespace ConsoleApplicationOneNoteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            OneNote.Application onenoteApp = new OneNote.Application();
            string pageChangesXml = "<?xml version='"1.0'"?>" +
                "<one:Page xmlns:one='"http://schemas.microsoft.com/office/onenote/2013/onenote'" " +
                "ID='"{787BF30C-0B35-4D74-A13B-AD00D046F97D}{1}{E19479572117852244555720107518407865185197031}'">" +
                "<one:Outline>" +
                "<one:OEChildren>" +
                "<one:OE>" +
                "<one:T>" +
                "<![CDATA[New Text]]>" +
                "</one:T>" +
                "</one:OE>" +
                "</one:OEChildren>" +
                "</one:Outline>" +
                "</one:Page>";
           onenoteApp.UpdatePageContent(pageChangesXml, DateTime.MinValue);
        }
    }
}

页面 ID 是从 OneNote 笔记本层次结构中获取的,我可以确认它是正确的,因为使用相同的 ID 调用GetPageContent工作正常。因此,在我看来,XML实际上一定存在一些问题。我错过了什么?


编辑:在 dbc 的评论之后,我更深入地研究了这个答案,它最初似乎来自这里,尽管它处理编辑 OneNote 页面中的现有条目而不是添加新内容,这就是我想做的。 将建议的代码减少到必要的代码给我留下了以下内容:

using System;
using System.Linq;
using XML = System.Xml.Linq;
using OneNote = Microsoft.Office.Interop.OneNote;
class Program
{
    static void Main(string[] args)
    {
        OneNote.Application onenoteApp = new OneNote.Application();
        XML.XNamespace ns = GetNamespace(onenoteApp);
        string PageId = "{787BF30C-0B35-4D74-A13B-AD00D046F97D}{1}{E19479572117852244555720107518407865185197031}";
        string xml;
        onenoteApp.GetPageContent(PageId, out xml, OneNote.PageInfo.piAll);
        var doc = XML.XDocument.Parse(xml);
        var outLine = doc.Descendants(ns + "Outline").First();
        var content = outLine.Descendants(ns + "T").First();
        string contentVal = content.Value;
        content.Value = "modified";
        onenoteApp.UpdatePageContent(doc.ToString(), DateTime.MinValue);
    }
    static XML.XNamespace GetNamespace(OneNote.Application app)
    {
        string xml;
        app.GetHierarchy(null, OneNote.HierarchyScope.hsNotebooks, out xml);
        var doc = XML.XDocument.Parse(xml);
        return doc.Root.Name.Namespace;
    }
}

但是,现在我收到错误0x8004200B,这被解释为该部分在文档中是只读的。当然,从未设置过只读访问权限,手动编辑所述页面没有问题。此外,谷歌对这个错误并没有真正的帮助。

也许不同的错误代码意味着我的 XML 现在具有一种格式,OneNote 可以接受该格式(尽管我看不出与我以前的方法有什么不同)。但是我仍然没有运气修改现有页面。特别是,两个链接线程建议上面的代码应该开箱即用,因为它在这两种情况下都是公认的答案。另一方面,在我的场景中,这根本不起作用。这是怎么回事?


编辑2:我的第二个代码块在运行Win 7 x64,OneNote 2013和Visual Studio 2015的另一台计算机上工作,到目前为止我使用的机器运行的是Win 7 x86,OneNote 2013和Visual Studio 2010。因此,也许VS2010库只是为了与OneNote 2013正确对话而旧?我会尝试收集更多的信息,看看我是否可以从中做出答案。

使用其 API 向 OneNote 添加内容时,“该部分是只读的”

我在使用 C# 和 OneNote 时也遇到了问题。每次我调用"写入"方法(这意味着我想编辑 OneNote 文件中的某些内容)时,我都会收到 HRESULT 的异常:0x8004200B。

我正在使用Microsoft OneNote 12.0 类型的库作为参考。我也尝试使用 14.0 类型的库,但在每种方法上,编译器都说类似

Error 1 'Microsoft.Office.Interop.OneNote.Application' does not contain a definition for 'GetHierarchy' and no extension method 'GetHierarchy' accepting a first argument of type ...

因此,我的解决方案是使用 OneNote 14.0 类型库并将嵌入互操作类型设置为 FALSE。您可以通过单击目录中的 OneNote 引用(如果已添加它)来找到它。

从那以后,一切正常!