Преобразование между идентификаторами OneNote для внутренних ссылок на HTML?

Я пытаюсь следить за ссылками на странице OneNote, чтобы получить содержимое связанной страницы через OneNote API. Ссылка HTML выглядит так: (удалил какой-то текст)

onenote:..\Partners\Cloud.one#Integrated%20Asset%20Manager%20(IAM)&section-id={DEDAE503-E375-49F2-B93D-F38B4121C70C}&page-id={7BF5121A-0B6C-4B08-9EAE-8FF2030257EE}&end&base-path={full-path-here}

Попытка сделать OneNoteApplication.GetPageContent со связанным идентификатором страницы вызывает ошибку для страницы, которая не найдена. Если я делаю GetHierarchy, идентификатор для страницы выглядит совсем по-другому:

{A98F0819-709E-016D-37A3-45218AD83E06}{1}{E19545547677840986606520149590302900659675241}

Кто-нибудь нашел способ конвертировать между различными типами идентификаторов или использовать идентификатор стиля HTML для навигации по API?

Ответ 1

Я согласен, что они не совпадают, используя OMSpy на одной из моих страниц:

На странице:

<snip>section-id={3261B7D6-C082-4CF3-9A1A-32095643EB84}&amp;
page-id={88491E75-B449-492B-BB2E-AF076D2D1911}</snip>

Связанный раздел:

<one:Section name="Inbox" ID="{DD778267-D782-04EC-074E-CA69C2E54808}{1}{B0}" 

Связанная страница:

<one:Page ID="{DD778267-D782-04EC-074E-CA69C2E54808}{1}
{E19538523858253232680620176633479485833791061}

Интересно, будет ли работать FindPages()?

Эта статья (скорее устаревшая) упоминает GUID, но относится только к 2 вызовам API, которые вызывают интерфейс OneNote, который вероятно, бесполезно для вас.

Мне было бы интересно получить ответ на этот вопрос, поэтому, пожалуйста, уточните, если вы получите более подробную информацию.

Ответ 2

В основном вы не можете конвертировать между этими двумя идентификаторами. Это разные идентификаторы. Идентификатор в гиперссылке является постоянным идентификатором, тогда как идентификаторы, используемые в API, являются идентификаторами времени выполнения. Идентификаторы времени выполнения будут отличаться от машины к машине, от сеанса к сеансу.

Есть еще одна проблема с этим подходом. Обратите внимание, что гиперссылка имеет намного больше информации, чем только идентификатор страницы. Относительный путь к разделу, имя страницы, идентификатор раздела и абсолютный путь к родительской папке раздела. OneNote будет использовать всю эту информацию для поиска страницы, которая, по ее мнению, является наилучшим соответствием для гиперссылки. На полученной странице может отсутствовать идентификатор в ссылке. На самом деле может быть несколько страниц или страниц с этим ID. Идентификатор также может даже не использоваться, если найдено совпадение с именами. Например, если OneNote находит страницу с именем Integrated Asset Manager (IAM) в разделе с именем Cloud.one, который не имеет идентификатора в ссылке, он все равно будет переходить к нему. Поэтому использование идентификатора страницы из ссылки и запрос этой страницы не будут правильным подходом, даже если API использовал постоянные идентификаторы вместо идентификаторов времени выполнения.

Вместо этого вы можете попросить OneNote перейти к указанной гиперссылке с помощью application.NavigateToUrl, а затем получить текущий идентификатор страницы и получить XML для него. Обратите внимание, что URL-адрес не может быть разрешен на действительную страницу (например, если страница была удалена или вы закрыли ноутбук и т.д.). В этом случае вы можете обработать ошибку из метода NavigateToUrl.

Ответ 3

NavigateToUrl не будет работать для моего приложения, потому что он вызывает текущую страницу для пользователя, и я хочу, чтобы приложение работало за кулисами. Так что мне нужно было немного рассказать, но в основном мне приходилось возвращаться к правильному идентификатору страницы, перебирая страницы в разделе и применяя метод GetHyperlinkToObject для преобразования в правильный идентификатор страницы.

    static private string FindPageById(string startingID, string pageId)
    {
        string strXML;
        XmlDocument xmlDoc = new XmlDocument();
        onApp.GetHierarchy(startingID, HierarchyScope.hsPages, out strXML);
        xmlDoc.LoadXml(strXML);
        foreach (XmlElement element in xmlDoc.SelectNodes("//one:Page", nsmgr))
        {
            string thisPageId = element.GetAttribute("ID");
            string hyperlink;
            onApp.GetHyperlinkToObject(thisPageId, "", out hyperlink);
            HRef href = GetHref(hyperlink); // parses out the string into an object
            if (href.PageId == pageId)
                return thisPageId;
        }
        return "";
    }