格式化html,有没有成熟的c#算法?

oldhunter 2019-08-29 12:09:26
对混乱的HTML,进行格式化,有没有成熟的c#算法?

如果是简单的缩进、排版,也比较好写。但有些情况不太容易处理,例如:
1、一个完整的 a、li 标签是否应该换行,什么时候需要换行。
2、js脚本内容如何缩进,样式表内容如何缩进与排版。
3、前后标签不对称时,如何处理。
4、以及其它一些细节问题。
...全文
1425 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
luj_1768 2019-09-03
  • 打赏
  • 举报
回复
一般首先需要格式化数据(内容),然后才能使用自动排版,然后进行人工调校,最后才能放到网站上。格式化数据时,很重要的工作是做标记(自动化排版需要一些额外信息)。
sp42a 2019-09-03
  • 打赏
  • 举报
回复
引用 10 楼 oldhunter 的回复:
VSCode 是用什么语言开发的? 下载源文件后,发现看不懂。 后缀为 .ts 的文件,是什么语言呢?

github地址:https://github.com/Microsoft/vscode
js or ts
  • 打赏
  • 举报
回复
引用 3 楼 github_36000833的回复:
[quote=引用 2 楼 娃都会打酱油了 的回复:]
如果是标准的html,你用xml读取后,再保存时指定要有格式不就行了?


有时候还是挺棘手的。

<p id = "这两个图像是紧挨着的">
<img src='1'/><img src='2'/>
</p>

<p id = "这两个图像间有一个空格">
<img src='1'/>
<img src='2'/>
</p>
[/quote] 因为你用p套的啊!代表段落,里面的内容都会显示,即使空格!如果用div你再试一下!
oldhunter 2019-08-30
  • 打赏
  • 举报
回复
谢谢各位!

我会测试一下大家推荐的:
1、AngleSharp(类似 HtmlAgilityPack,但功能更强大)
2、VSCode (前端开发插件,可能是 Chrome 的插件)

测试后,最终采用的方案,会反馈到帖子中。

另外,HtmlAgilityPack 不支持导出为格式化后的HTML,只能导出为原格式,之前测试过:


HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
txtHmtl.Text = doc.DocumentNode.OuterHtml;


之前,也尝试过 HtmlAgilityPack.HtmlDocument 的相关属性,没有发现哪个属性可以决定格式化HTML。




oldhunter 2019-08-30
  • 打赏
  • 举报
回复
引用 12 楼 github_36000833 的回复:
[quote=引用 10 楼 oldhunter 的回复:]
VSCode 是用什么语言开发的? 下载源文件后,发现看不懂。 后缀为 .ts 的文件,是什么语言呢?

github地址:https://github.com/Microsoft/vscode

javascript

具体来说,VisualStudio Code基于Electron项目,Electron使用Node.js驱动,并用Chromium来做UI(可以理解成浏览器和网页来做UI)。因此VisualStudio Code可以跨平台(还可运行在MacOSX和Linux上)。[/quote]

谢谢,看了一下 Electron 项目,确实很强大。
VisualStudio Code 完全没有用到原生代码对吗,如c#/c++?但也没有看到集成 Chromium 内核啊?是已经封装到 exe 主程序了吗?如下图:


oldhunter 2019-08-30
  • 打赏
  • 举报
回复
引用 11 楼 货郎大叔 的回复:
参考vs本身或者vscode本身,他能格式成啥样就是通用标准,如果vs都不能格式的,你只能单独给标准了


vscode开源代码中,哪一部分是标准呢?是JS代码,还是 .json 的语法库文件?

github_36000833 2019-08-30
  • 打赏
  • 举报
回复
引用 10 楼 oldhunter 的回复:
VSCode 是用什么语言开发的? 下载源文件后,发现看不懂。 后缀为 .ts 的文件,是什么语言呢?

github地址:https://github.com/Microsoft/vscode

javascript

具体来说,VisualStudio Code基于Electron项目,Electron使用Node.js驱动,并用Chromium来做UI(可以理解成浏览器和网页来做UI)。因此VisualStudio Code可以跨平台(还可运行在MacOSX和Linux上)。
货郎大叔 2019-08-30
  • 打赏
  • 举报
回复
参考vs本身或者vscode本身,他能格式成啥样就是通用标准,如果vs都不能格式的,你只能单独给标准了
oldhunter 2019-08-30
  • 打赏
  • 举报
回复
VSCode 是用什么语言开发的? 下载源文件后,发现看不懂。 后缀为 .ts 的文件,是什么语言呢?

github地址:https://github.com/Microsoft/vscode
oldhunter 2019-08-30
  • 打赏
  • 举报
回复
AngleSharp 已测试,没有找到内置的格式化HTML的策略,有一个 ToHtml 方法,但需要自己写接口实现。测试代码如下:


AngleSharp.Html.Parser.HtmlParserOptions parserOptions = new AngleSharp.Html.Parser.HtmlParserOptions();
AngleSharp.Html.Parser.HtmlParser htmlParser = new AngleSharp.Html.Parser.HtmlParser(parserOptions);
AngleSharp.Dom.IDocument document = htmlParser.ParseDocument(html);
//txtHmtl.Text = document.DocumentElement.OuterHtml;
using (StringWriter textWriter = new StringWriter())
{
IMarkupFormatter formatter = new MyMarkupFormatter(); // 需要自己实现接口,没有格式化策略
document.ToHtml(textWriter, formatter);
txtHmtl.Text = textWriter.ToString();
}


测试 VSCode 时,安装了一个windows桌面程序,未找到相关算法或插件。

XBodhi. 2019-08-29
  • 打赏
  • 举报
回复
其实你可以 调用 VSCODE 的IDE 的DLL,参考他的源代码。
wanghui0380 2019-08-29
  • 打赏
  • 举报
回复
实际上上面提到html-agility-pack也是一样的解法 html-agility-pack 不过是省掉前面两部,直接出Dom树,然后遍历输出(可选使用文本模板引擎)
wanghui0380 2019-08-29
  • 打赏
  • 举报
回复
基本上这个东西还在一个范畴,词法分析 通常的做法,先从标准的H5,BNF范式里构造 词法分析代码,从词法分析代码里把文本散成语法树,然后遍历语法树,去格式(树嘛,当然有枝,有叶。叶子缩进,同级并排) 词法分析常规手段 “Antlr4”(也许微软后面的那个 Rosylyn 也可以用,没特意关注过,我一般使用Antlr4) 当然这是标准的玩意,如果有个别非标的,得重新写一下BNF定义,把非标的加进去。 so,总结一下,通行解法 BNF---文法解析器(Antlr4,yacc, Rosylyn)---语法树---文本引擎(比如T4或者Razor)
wanghui0380 2019-08-29
  • 打赏
  • 举报
回复
参考vscode,代码都开源了。你的格式化要求,微软当然自己也要实现,不然那有人用他啊。 ps:关于规则,参考vs本身或者vscode本身,他能格式成啥样就是通用标准,如果vs都不能格式的,你只能单独给标准了
github_36000833 2019-08-29
  • 打赏
  • 举报
回复
引用 2 楼 娃都会打酱油了 的回复:
如果是标准的html,你用xml读取后,再保存时指定要有格式不就行了?


有时候还是挺棘手的。

<p id = "这两个图像是紧挨着的">
<img src='1'/><img src='2'/>
</p>

<p id = "这两个图像间有一个空格">
<img src='1'/>
<img src='2'/>
</p>
  • 打赏
  • 举报
回复
如果是标准的html,你用xml读取后,再保存时指定要有格式不就行了?
github_36000833 2019-08-29
  • 打赏
  • 举报
回复
自己写很花时间,还不容易做好(有很多时间的话,是一个非常好的练手项目)。

可以先考虑使用或参考开源软件,比如
https://github.com/AngleSharp/AngleSharp

或用HtmlAgilityPack 来读出一个DOM,然后自己写缩进节点?
HtmlAgilityPack 有Nuget包。
项目地址:https://github.com/zzzprojects/html-agility-pack/

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧