前言:为什么我们需要这个工具?

在做零点博客的内容迁移或者对接第三方接口时,经常会遇到EMLOG原生导出的数据结构不规范的问题。比如文章里的富文本标签是HTML代码,而我们需要的是纯文本或者JSON格式的结构化数据。很多时候,直接用PHP去处理老旧的数据库结构不如用C#直接连库来得快。

今天这篇实操教程,我就带大家用C#硬核撸一个数据清洗工具,不仅能把EMLOG的博文数据吐出来,还能顺便把SQL注入的问题给你们演示一遍,干货满满。

一、 环境准备与数据库连接

首先,确保你本地有MySQL数据库。EMLOG的表结构并不复杂,我们需要重点关注`emlog_log`表和`emlog_user`表。

在C#中,我们需要引入MySql.Data包。连接字符串是关键,切记不要把数据库密码明文写在代码里,也不要直接拼接SQL字符串。

string connString = "Server=localhost;Database=emlog_db;User=root;Password=your_password;CharSet=utf8mb4;";
string sql = "SELECT lid, title, content, author, date FROM emlog_log WHERE istop=0 ORDER BY date DESC";

这里我们只做演示,直接写在了变量里。注意,SQL注入防护在增删改查中尤为重要,但在我们的纯查询场景下,直接执行查询命令相对安全,但为了体现开发规范,我们依然要注意参数化查询。

二、 结合正则表达式清洗数据

EMLOG生成的内容通常包含很多HTML标签和特殊的短标签,比如正文里的``或者图片标签。这肯定不是我们想要的接口格式。

这时候,正则表达式就是我们的好帮手。我们需要写一个函数来把这些垃圾代码干掉,只保留纯文本。

// 示例:移除所有HTML标签和短标签,仅保留纯文本
Regex rx = new Regex(@<script[^>]*?>.*?</script>|<[^>]+>, RegexOptions.IgnoreCase);
string cleanContent = rx.Replace(rawContent, string.Empty);

这块代码在实际开发中非常常见,很多新手写爬虫或者解析工具时,往往忽略这一步,导致导出的数据全是乱码HTML,没法用。

三、 构建实体类与JSON生成

数据清洗完成后,我们需要把它封装成一个对象,然后序列化为JSON。为了方便后续的接口开发,我们定义一个`BlogPost`类。

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime Date { get; set; }
}

在循环读取数据库时,把每条记录映射到这个类,最后利用`Newtonsoft.Json`或者.NET自带的`System.Text.Json`进行序列化。

四、 底层避坑指南与XML备份

有时候JSON数据太大传输有问题,或者某些老旧系统只认XML,这时候我们需要把数据转换成XML格式。写XML其实和写JSON类似,都是操作字符串拼接,但要注意转义字符。

这里有一个容易忽略的坑:日期格式。如果你的`Date`字段是`DateTime`类型,直接存入XML会变成`2023/10/27 10:00:00`,这在某些**在线工具开发**中可能会引起解析错误。建议在序列化前强制转成`yyyy-MM-dd`格式。

五、 实操演示:完整流程代码

下面是直接可落地的核心逻辑代码。你可以直接复制到一个C#控制台项目中跑。

using System;
using System.Collections.Generic;
using System.Data.SqlClient; // 假设已迁移到SQL Server做演示,逻辑类似
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;

class Program
{
    static void Main(string[] args)
    {
        string connStr = "Server=...;Database=...;User Id=...;Password=...;";

        // 1. 连接数据库
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            string sql = "SELECT id, title, content FROM articles WHERE status=1";

            // 2. 使用预处理语句防止注入
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();

                    while (reader.Read())
                    {
                        // 3. 正则清洗HTML标签
                        string content = Regex.Replace(reader["content"].ToString(), @<script[^>]*?>.*?</script>|<[^>]+>, string.Empty);

                        var item = new Dictionary<string, string>
                        {
                            { "id", reader["id"].ToString() },
                            { "title", reader["title"].ToString() },
                            { "content", content }
                        };
                        list.Add(item);
                    }

                    // 4. 输出JSON或XML
                    Console.WriteLine(JsonConvert.SerializeObject(list, Formatting.Indented));
                }
            }
        }
    }
}

这段代码涵盖了爬虫开发的基础思路:连接 -> 清洗 -> 存储/解析。无论你是想做一个自动发帖的工具,还是做数据备份,都非常适用。

总结

作为一个深研技术的博主,我建议大家多动手写代码。很多人看懂了原理,一上手写代码全是坑。这篇文章的实操教程没有废话,重点在于展示了如何用C#结合正则表达式解决EMLOG数据清洗问题,并给出了标准的SQL注入防护写法。

如果你觉得有用,欢迎收藏零点博客,后续我会分享更多关于HTML/CSS/JS前端与后端交互的干货!