12

我正在尝试跟踪 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}

尝试使用链接的页面 ID 执行 OneNoteApplication.GetPageContent 会引发找不到页面的错误。如果我执行 GetHierarchy,页面的 ID 看起来会非常不同:

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

有没有人找到一种在不同类型的 ID 之间转换或使用 HTML 样式 ID 在 API 中导航的方法?

4

3 回答 3

2

您基本上无法在这两个 ID 之间进行转换。它们是不同的 ID。超链接中的 ID 是永久 ID,而 API 中使用的 ID 是运行时 ID。运行时 ID 因机器而异,因会话而异。

该方法还有另一个问题。请注意,超链接包含的信息远不止页面 ID。部分的相对路径、页面名称、部分 ID 和部分父文件夹的绝对路径。OneNote 将使用所有这些信息来定位它认为与超链接最匹配的页面。生成的页面可能没有链接中的 ID。实际上可能有多个页面或没有具有该 ID 的页面。如果找到与名称匹配的 ID,甚至可能不使用 ID。例如,如果 OneNote在链接中没有 ID 的命名Integrated Asset Manager (IAM)部分中找到命名的页面,它仍会导航到该页面。Cloud.one因此,即使 API 使用永久 ID 而不是运行时 ID,从链接中获取页面 ID 并查询该页面也不是正确的方法。

您可以做的是让 OneNote 使用导航到所述超链接application.NavigateToUrl,然后获取当前页面 ID 并为其获取 XML。请注意,该 URL 可能无法解析为有效页面(例如,如果该页面被删除或您关闭了笔记本等)。在这种情况下,您可以处理NavigateToUrl方法中的错误。

于 2014-02-22T05:46:37.253 回答
2

我同意他们不匹配,在我的一个页面上使用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,但只提到了调用 OneNote UI 的 2 个 API 调用,这对你来说可能没用。

我有兴趣自己回答这个问题,所以如果您有任何进一步的见解,请更新。

于 2014-01-07T08:20:32.053 回答
0

NavigateToUrl 不适用于我的应用程序,因为它会导致当前页面为用户更改,我希望应用程序在幕后工作。所以我必须做的是有点麻烦,但基本上我必须通过循环浏览该部分中的页面并应用 GetHyperlinkToObject 方法转换为正确的页面 id 来回到正确的页面 id。

    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 "";
    }
于 2014-06-22T21:36:20.513 回答