"Раздел доступен только для чтения" при добавлении контента в OneNote с использованием его API
В настоящее время я пытаюсь добавить контент на страницу OneNote 2013 с помощью UpdatePageContent
функция из API OneNote, предоставляемая 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);
}
}
}
Идентификатор страницы был получен из иерархии OneNote Notebook, и я могу подтвердить, что он верен, поскольку вызовы 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 Studio 2010. Поэтому, возможно, библиотека VS2010 просто старому правильно общаться с OneNote 2013? Я постараюсь собрать больше информации и посмотреть, смогу ли я найти ответ.
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 (если вы уже добавили его) внизу списка.
С тех пор все работало нормально!