C# 如何解析HTML节点
我的网站流量C# 如何解析HTML节点,c#,asp.net,asp.net-mvc,openxml,C#,Asp.net,Asp.net Mvc,Openxml,我的网站流量 经过身份验证的用户将上载docx 我正在使用OpenXmlPowerToolsAPI将此docx转换为HTML 保存文件 将html页面的每个节点保存到数据库中 数据库:- tblNodeCollection 诺代德 节点类型(预期值-,,,) 节点内容(预期值-这是p内容 在第3步之前没有问题。但是我不知道如何将节点集合保存到表中 我在谷歌上搜索并找到了htmlagiiltypack,但对它知之甚少 using DocumentFormat.OpenXml.Packagin
OpenXmlPowerTools
API将此docx转换为HTMLtblNodeCollection
- 诺代德
- 节点类型(预期值-
,
,
,
) - 节点内容(预期值-
这是p内容
htmlagiiltypack
,但对它知之甚少
using DocumentFormat.OpenXml.Packaging;
using HtmlAgilityPack;
using OpenXmlPowerTools;
namespace ExportData
{
public class ExportHandler
{
public void GenerateHTML()
{
byte[] byteArray = File.ReadAllBytes(@"d:\test.docx");
using (MemoryStream memoryStream = new MemoryStream())
{
memoryStream.Write(byteArray, 0, byteArray.Length);
using (WordprocessingDocument doc =
WordprocessingDocument.Open(memoryStream, true))
{
HtmlConverterSettings settings = new HtmlConverterSettings()
{
PageTitle = "My Page Title"
};
XElement html = HtmlConverter.ConvertToHtml(doc, settings);
File.WriteAllText(@"d:\Test.html", html.ToStringNewLineOnAttributes());
}
}
//now how do I proceed from here
}
}
非常感谢任何类型的帮助/指导。根据我们在评论中的讨论,以及您似乎一直坚持的部分,我建议您: 这里的内容可能会为如何转换为html提供一些帮助 当然,您仍然面临需要能够拆分每个页面的问题(正如您在评论中提到的),您可能能够将每个页面单独导出为html 对于您的数据库结构,我推荐类似于:
[Document Table]
- Document ID
- Document Name
- Any other data you need per-document
[Node Table]
- Node ID
- Document ID (foreign key)
- Node Content (string)
确保在节点表上有合理的索引,因为随着时间的推移,您可能会在数千行(如果不是数百万行的话)上查找索引(尤其是文档id上的一行)
对每个节点都有一个索引属性(例如bigint位置)也可能很有用,这样您就可以通过将节点按顺序重新组合在一起来重建文档
总的来说,我的建议是试着让你的老板明白原因,真正反对这个愚蠢的设计决定。根据我们在评论中的讨论,以及你似乎一直坚持的部分,我建议如下: 这里的内容可能会为如何转换为html提供一些帮助 当然,您仍然面临需要能够拆分每个页面的问题(正如您在评论中提到的),您可能能够将每个页面单独导出为html 对于您的数据库结构,我推荐类似于:
[Document Table]
- Document ID
- Document Name
- Any other data you need per-document
[Node Table]
- Node ID
- Document ID (foreign key)
- Node Content (string)
确保在节点表上有合理的索引,因为随着时间的推移,您可能会在数千行(如果不是数百万行的话)上查找索引(尤其是文档id上的一行)
对每个节点都有一个索引属性(例如bigint位置)也可能很有用,这样您就可以通过将节点按顺序重新组合在一起来重建文档
总的来说,我的建议是试着让你的老板明白原因,真正反对这个愚蠢的设计决定。以下是如何解析html并将其保存到数据库的简化过程。我希望这能帮助你和/或给你一个解决问题的方法
HtmlWeb h = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = h.Load("http://stackoverflow.com/questions/41183837/how-to-store-html-nodes-into-database");
HtmlNodeCollection tableNodes = doc.DocumentNode.SelectNodes("//table");
HtmlNodeCollection h1Nodes = doc.DocumentNode.SelectNodes("//h1");
HtmlNodeCollection pNodes = doc.DocumentNode.SelectNodes("//p");
//get other nodes here
foreach (var pNode in pNodes)
{
string id = pNode.Id;
string content = pNode.InnerText;
string tag = pNode.Name;
//do other stuff here and then save to database
//just an example...
SqlConnection conn = new SqlConnection("here goes conection string");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO tblNodeCollection (Tag, Id, Content) VALUES (@tag, @id, @content)";
cmd.Parameters.Add("@tag", tag);
cmd.Parameters.Add("@id", id);
cmd.Parameters.Add("@content", content);
cmd.ExecuteNonQuery();
}
下面是如何解析html并将其保存到数据库的简化过程。我希望这将帮助您和/或让您了解如何解决您的问题
HtmlWeb h = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = h.Load("http://stackoverflow.com/questions/41183837/how-to-store-html-nodes-into-database");
HtmlNodeCollection tableNodes = doc.DocumentNode.SelectNodes("//table");
HtmlNodeCollection h1Nodes = doc.DocumentNode.SelectNodes("//h1");
HtmlNodeCollection pNodes = doc.DocumentNode.SelectNodes("//p");
//get other nodes here
foreach (var pNode in pNodes)
{
string id = pNode.Id;
string content = pNode.InnerText;
string tag = pNode.Name;
//do other stuff here and then save to database
//just an example...
SqlConnection conn = new SqlConnection("here goes conection string");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO tblNodeCollection (Tag, Id, Content) VALUES (@tag, @id, @content)";
cmd.Parameters.Add("@tag", tag);
cmd.Parameters.Add("@id", id);
cmd.Parameters.Add("@content", content);
cmd.ExecuteNonQuery();
}
我们可以问一下你为什么要将节点保存在数据库中吗?为什么不保存整个XML并在需要时在内存中解析和处理它?@Clint No.
该网站与每个节点都有很多其他事情要做。任何关于这可能是什么的上下文?它可能完全决定了最佳解决方案。该网站正在进行电子学习。因此培训师将上传加载一个word文件,其中包含页面的每个部分(节点将具有seprate reviewer&approver这可能是一个典型的锤击&钉子问题,您有什么理由不能将文档拆分为其组成页面,并将每个页面存储为一个单独的文档,并将它们与数据库中的条目链接?这样您就可以实现分离,并能够在他结束了。文档也被压缩了,因此,如果你存储每个节点的数据,那么随着时间的推移,你将面临大量文档的严重数据爆炸。我们可以问一下,你为什么要尝试将节点保存在数据库中?为什么不保存整个XML并在需要时在内存中解析和处理它?@Clint No.
该网站有很多与每个节点相关的其他内容。有什么上下文吗?它可能完全决定了最佳解决方案。该网站进入电子学习。因此培训师将上传一个word文件,其中包含页面的每个部分(节点将具有seprate reviewer&approver这可能是一个典型的锤击&钉子问题,您有什么理由不能将文档拆分为其组成页面,并将每个页面存储为一个单独的文档,并将它们与数据库中的条目链接?这样您就可以实现分离,并能够在他结束了。文档也被压缩了,所以如果你存储每个节点的数据,那么随着时间的推移,你将面临大量文档的严重数据爆炸。但是我该如何将我的html页面拆分为节点。这是我的疑问,但我该如何将我的html页面拆分为节点。这是我的疑问。你的帖子似乎与我的需求高度相关。让我进一步讨论选中此项。谢谢:)是的。它满足了我的需要。谢谢:)这里有一个补充说明,但真正的问题似乎是如何使用HtmlAgilityPack解析HTML:)我不知道该怎么做才能得到HTML页面的节点。但是在你发表文章之后,我知道了如何使用API。谢谢。你能检查一下这篇文章吗。你的文章似乎与我的需要高度相关。让我进一步检查一下。谢谢:)是的。它满足了我的需要。谢谢:)这是一个更新,但真正的问题似乎是如何使用HtmlAgilityPack解析HTML:)我不知道,我该如何获取HTML页面的节点。但是在你的帖子之后,我知道了如何使用API。谢谢,你能看看这个帖子吗。