Преобразование между идентификаторами OneNote для внутренних ссылок на HTML?
Я пытаюсь следить за ссылками на странице OneNote, чтобы получить содержимое связанной страницы через OneNote API. Ссылка HTML выглядит так: (удалил какой-то текст)
onenote:..\Partners\Cloud.one#Integrated%20Asset%20Manager%20(IAM)§ion-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}&
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 "";
}