簡體   English   中英

使用其API向OneNote添加內容時,“該部分是只讀的”

[英]“The section is read-only” when adding content to OneNote using its API

當前,我正在嘗試使用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 Notebook層次結構獲得的,我可以確認它是正確的,因為使用相同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 ,其解釋為在文檔中該部分為只讀 當然,從未設置過只讀訪問權限,並且手動編輯該頁面沒有問題。 另外,對於該錯誤,Google並沒有真正幫助。

也許不同的錯誤代碼意味着我的XML現在具有一種格式,該格式已被OneNote接受(盡管我看不出與以前的方法有所不同)。 但是我仍然沒有運氣來修改現有頁面。 特別是,兩個鏈接的線程建議上面的代碼應該開箱即用,因為在兩種情況下它都是公認的答案。 另一方面,在我的情況下,這根本不起作用。 這里發生了什么?


編輯2:我的第二個代碼塊在運行Win 7 x64,OneNote 2013和Visual Studio 2015的另一台機器上工作,到目前為止,我在那台機器上運行Win 7 x86,OneNote 2013和Visual Studio2010。所以VS2010庫是只是為了老而能正確地與OneNote 2013對話? 我將嘗試收集更多信息,看看是否可以做出答復。

我在使用C#和OneNote時也遇到了問題。 每次我調用“寫”方法時,這意味着我想編輯OneNote文件中的內容,就會得到HRESULT異常:0x8004200B。

我使用Microsoft OneNote 12.0類型庫作為參考。 我也嘗試使用14.0類型的Library,但是在每種方法中,編譯器都表示類似

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參考(如果已添加)來找到它。

從那時起,一切正常!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM