"Раздел доступен только для чтения" при добавлении контента в 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 (если вы уже добавили его) внизу списка.

С тех пор все работало нормально!

Другие вопросы по тегам