阅读.html #XX并在网络浏览器上显示

时间:2013-03-20 20:40:36

标签: c# html

我在本地读取html文件,但这些“.html”文件在内部划分,其中包含forme“file.html#xxxxx”。 我在webbrowser上显示这些文件,但它不接受由于“#”而给出的路径

我正在阅读一本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

1 个答案:

答案 0 :(得分:0)

我希望尽可能保持答案清晰,所以我完全重写了答案。我相信你需要做这些步骤:

  • 订阅名为NavigatingDocumentCompleted
  • 的活动
  • 使用代码解析网址并将其拆分为#
  • 覆盖导航并为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;
       }
    }
}

实际上没有尝试过这个,但我希望这会帮助你解决问题。