-1

我在本地读取 html 文件,但这些“.html”文件在内部被分割,格式为“file.html#xxxxx”。我在网络浏览器上显示这些文件,但由于“#”,它不接受给出的路径

我正在阅读一本 epub 书,它的章节在内部由“#”划分,解析后我为每一章得到它自己的分区,这个分区由 # 表示。

这是除法的一个例子

<navMap>
    <navPoint id="np-1" playOrder="1">
      <navLabel>
        <text>YOUR NATIONAL PARKS BY ENOS A. MILLS</text>
      </navLabel>
      <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00000"/>
      <navPoint id="np-2" playOrder="2">
        <navLabel>
          <text>PREFACE</text>
        </navLabel>
        <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00001"/>
      </navPoint>
      <navPoint id="np-3" playOrder="3">
        <navLabel>
          <text>CONTENTS</text>
        </navLabel>
        <content src="@public@vhost@g@gutenberg@html@files@42248@42248-h@42248-h-0.htm.html#pgepubid00002"/>
      </navPoint>
</navMap>

并显示:

  navPoint = toc.NavMap[0];
 string srcContent = navP.Src;
    webBrowser1.Source= path+srcContent
4

1 回答 1

0

我想保持答案尽可能干净,所以我完全重写了答案。我相信您需要执行以下步骤:

  • 订阅调用的事件NavigatingDocumentCompleted
  • 使用代码解析 url 并将其拆分为#
  • 覆盖导航并为 WebBrowser 提供没有锚的新的干净 URL
  • 例如,将锚点存储在变量中
  • 加载文档后,只需找到锚点引用的元素并滚动到它

结果可能看起来像这样。请注意,这不是复制和粘贴代码,我只是想让您了解如何完成您所追求的。您需要根据需要修改此代码!

假设请求的网址是myFile.html#customAnchor

webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    if (e.Url.Contains("#")
    {
       string[] urlParts = e.Url.Split('#'); // split the string by character #
       string newUrl = urlParts[0];          // = myFile.html
       _somePrivateField = urlParts[1];      // = customAnchor

       webBrowser1.Navigate(new Uri(newUrl));
    }
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElementCollection elements = this.webBrowser1.Document.Body.All;
    foreach(HtmlElement element in elements){
       string nameAttribute = element.GetAttribute("Name");
       if(!string.IsNullOrEmpty(nameAttribute) && nameAttribute == _somePrivateField){
          element.ScrollIntoView(true);
          break;
       }
    }
}

实际上还没有尝试过,但我希望这对您解决问题有足够的帮助。

于 2013-03-20T20:42:31.770 回答