使用其API

时间:2016-01-18 07:58:24

标签: c# xml onenote onenote-api

目前,我正在尝试使用UpdatePageContent引用提供的OneNote API中的Microsoft.Office.Interop.OneNote函数向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 Notebook层次结构获得的,我可以确认它是正确的,因为使用相同ID的GetPageContent调用工作正常。所以在我看来,XML确实存在一些问题。我错过了什么?

编辑:在dbc的评论之后,我更深入地研究了this答案,该答案最初似乎来自here,尽管它会在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,在文档中解释为该部分是只读的。当然,没有设置只读访问权限,手动编辑所述页面也没有问题。此外,Google对此错误并没有多大帮助。

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

编辑2:我的第二个代码块适用于运行Win 7 x64,OneNote 2013和Visual Studio 2015的另一台机器,我到目前为止使用的机器运行的是Win 7 x86,OneNote 2013和Visual Studio 2010.所以也许是VS2010库是否适合与OneNote 2013正常交流?我将尝试收集更多信息,看看我是否可以从中得出答案。

1 个答案:

答案 0 :(得分:1)

我在使用C#和OneNote时也遇到了问题。每当我调用一个“写”方法时,意味着我想在OneNote-File中编辑一些内容,我得到了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 Reference(当您已经添加它时)在proberties中找到它。

此后,一切正常!