HSharp icon indicating copy to clipboard operation
HSharp copied to clipboard

HDoc的索引器是否不妥呢

Open altbswing opened this issue 6 years ago • 5 comments

大佬您好,经常在油管看到您的视频学习,受益匪浅 我也是一名C# .NET 的死忠粉

看到项目比较感兴趣,拜读了一下您的代码 关于HDoc获取元素的地方,略有不同看法,请允许在下想发表一点愚见。

  • [ ] 在解析时候,是否应该除List以外,再用一个Dictionary来做索引, 以提高按名称查找的效率, 每次都Children.Find(t => t.TagName == tagName); 会全局遍历,元素多的时候是否会性能不佳呢。

  • [ ] 关于索引器中的处理,HTag this[string tagName],HTag this[int tagIndex] 这2个索引器中没有做任何异常处理,如果是示例中的连续调用(newDocument["html"]["head"]["meta",0]) 如果填错了名字或者索引,造成了空指针或者越界异常,不太容易查找错误地点。 是否应该throw明确的异常信息,是哪个名字错了,或者哪个索引错了。

  • [ ] 可能是我个人的爱好 个人感觉["meta"][0], 要比["meta",0], 更具有可读性。

altbswing avatar Jun 19 '19 16:06 altbswing

Thanks for your contribution! Will resolve.

Anduin2017 avatar Jun 19 '19 16:06 Anduin2017

第三点我试了下,基本上是不可行的。

因为HTag this[string tagName]的返回值表示一个标签,而不是标签的集合。(默认是第一个)

如果按照上面的改法,必须改成返回一个集合。那么就会和老版本不向下兼容了。这会很麻烦……

所以只有在额外传递索引后,仍然返回标签,但是不再返回第一个。

Anduin2017 avatar Jun 20 '19 06:06 Anduin2017

关于第二点,我试了一下。

如果HTag this[string tagName]填错,结果会返回null。我认为这是符合期待的。使用者能够明白这里索引失败了。

如果HTag this[string tagName, int tagIndex]越界,会抛出异常:

System.ArgumentOutOfRangeException: 'Index was out of range.

我认为这也是符合期待的。

如果你建议提供更详细的错误信息,我看了看好像不是很好改。你可以试试。如果有相关的PR,我会同意。

Anduin2017 avatar Jun 20 '19 06:06 Anduin2017

关于第一点,我也仔细想了一下。

Children是能够保证一致性的一个值,而且性能不错。一般它不会太大,所以不会有太大问题。

其实目前实际使用中,最需要提升性能的,是它的AllUnder方法(前序遍历递归获取整个元素下所有子元素的集合),因为这个方法没有任何索引,每次调用时都会递归整个HDoc。

我最近计划给AllUnder创建索引。Children并没有形成性能瓶颈。建立索引也行,但是一般一个标签下平级标签一般不会太多,所以性能提升应该不明显,反而会影响一致性。

或者干脆放弃List,直接用Dictionary来代替它,应该可行。

这里我暂时打算维持现有代码不动(HSharp这个项目是我三年前左右开发的,今天已经很难读懂当时我的一些想法了……)。

如果你愿意贡献,欢迎提交PR。我会同意。

Anduin2017 avatar Jun 20 '19 06:06 Anduin2017

谢谢回复,原来如此,大佬想得果然比我全面。

在接触到你这个项目之前,我一直用HtmlAgilityPack的 很喜欢xpath查找功能,基本上chrome复制一下xpath,直接贴进去就能拿想要的数据。 如果这个项目也能支持就好了,虽然我知道实现起来不轻松。

我如果有空会尝试改改看的,到时候还忘多指教

altbswing avatar Jun 20 '19 12:06 altbswing