[英]“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.