使用其 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正确对话而旧?我会尝试收集更多的信息,看看我是否可以从中做出答案。
我在使用 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 引用(如果已添加它)来找到它。
从那以后,一切正常!