0

目前,我正在尝试使用参考UpdatePageContent提供的 OneNote API 中的函数将内容添加到 OneNote 2013 页面Microsoft.Office.Interop.OneNote。但是,我总是得到错误代码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 Notebook 层次结构中获得的,我可以确认它是正确的,因为调用GetPageContent使用相同的 ID 工作正常。所以在我看来,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 交谈?我将尝试收集更多信息,看看我是否可以从中做出答案。

4

1 回答 1

1

我在使用 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 参考(当您已经添加它时)找到它。

从那时起,一切正常!

于 2016-04-21T08:54:26.630 回答