如何解析 HTML 个节点

How to parse HTML nodes

我的网站流量。

  1. 经过身份验证的用户将上传 docx。
  2. 我正在使用 OpenXmlPowerTools API 将此 docx 转换为 HTML
  3. 保存文件
  4. 将html页面的每个节点保存到数据库中。

数据库:-

tblNodeCollection

在步骤 #3 之前没有问题。但是我 对如何将节点集合保存到 table.

毫无头绪

我用谷歌搜索并找到了 HTMLAgiiltiyPack,但不太了解它。

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
    }
 }

任何类型的 help/guidance 高度赞赏。

根据我们在评论中的讨论以及您似乎坚持的部分,我建议如下:

SO 上的 Question 可能会提供一些关于如何转换为 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)

确保您在节点 table 上有合理的索引,因为随着时间的推移,您可能会在数千行(如果不是数百万行)中进行搜索(尤其是文档 ID 上的行)。

为每个节点(例如 bigint 位置)创建一个索引 属性 可能也很有用,这样您就可以通过按顺序将节点放回原处来重建文档。

不过,总的来说,我的建议是尝试让你的老板明白原因,并真正反对这个愚蠢的设计决定。

下面是如何解析 html 并将其保存到数据库的简化过程。我希望这会帮助你 and/or 让你知道如何解决你的问题

        HtmlWeb h = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = h.Load("");
        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();
        }