零点复盘:C# XML解析实战与SQL注入防护,搞定EMLOG爬虫数据清洗
在做零点博客的自动化工具时,最近遇到个棘手问题:爬虫抓取的数据五花八门,好不容易搞定了 HTML 爬取,结果对方 API 返回的全是 XML 格式。如果不把这堆 XML 数据清洗干净存入 MySQL,后面写 EMLOG 插件全是扯淡。今天就跟大家掏心窝子聊聊,C# 中到底该怎么高效进行 XML解析,以及那个绝对不能省的 SQL注入防护。
一、 XML解析的两种姿势:DOM vs LINQ
一开始我想着直接用 XmlDocument 这种老古董,结果发现代码写得跟面条一样,全是嵌套的 if 判断。后来在零点博客的技术群里听大佬推荐,转用了 C# 自带的 LINQ to XML,爽得不行。
如果你的 XML 结构比较扁平(比如 RSS 订阅),推荐用 LINQ:
// 假设这是爬虫抓到的原始字符串
string xmlContent = "零点博客 http://.../ ";
// 实例化 XElement
XElement root = XElement.Parse(xmlContent);
// 使用 LINQ 查询,直接获取节点值
string blogTitle = root.Element("channel")?.Element("title")?.Value;
Console.WriteLine($"标题:{blogTitle}");
如果你面对的是那种几千行、层级极深的复杂 XML,才建议祭出 XmlDocument 这种 DOM 树来遍历。别问我怎么知道的,踩过坑才知道这两种姿势的区别。
二、 正则与编码:数据清洗的“坑”
爬虫返回的 XML 通常不是纯净的。比如抓取新闻源时,文本节点里经常夹杂 HTML 标签。这时候单纯靠 XML解析是不够的,你得配合 正则表达式 做最后的一刀。这里有个大坑:编码问题。
我之前就因为没设置 Encoding,解析出来的中文全是乱码(中文变成 `???`)。切记,在 `XElement.Parse` 之前,先确认源码的编码(通常在 XML 声明里),或者手动指定:
using (var reader = XmlReader.Create(url, new XmlReaderSettings { Encoding = Encoding.UTF8 })) {
XElement root = XElement.Load(reader);
// ... 处理逻辑
}
三、 核心环节:SQL注入防护与预处理语句
XML 解析完只是第一步,如何安全地把这些数据写入 MySQL?这是后端开发的命门。在零点博客之前的教程里提到过拼接 SQL 的坏处,这里再强调一次:永远不要信任任何从 XML 解析出来的变量。
为了演示 SQL注入防护,我写了一个简单的前端拼接方案(不要在生产环境这样用,只是为了说明原理)和对应的 C# 参数化查询方案:
string sql = "INSERT INTO articles (title, content, create_time) VALUES (@title, @content, @time)";
SqlCommand cmd = new SqlCommand(sql, conn);
// 关键点:使用参数化查询,而不是直接拼接字符串
cmd.Parameters.AddWithValue("@title", parsedTitle);
cmd.Parameters.AddWithValue("@content", parsedContent);
cmd.Parameters.AddWithValue("@time", DateTime.Now);
cmd.ExecuteNonQuery();
只要你用了 `Parameters.AddWithValue`,哪怕 XML 里的标题是 `1 OR 1=1 --`,数据库也会把它当成纯文本字段处理,绝对安全。
四、 PHP 处理 XML 的小技巧
虽然我在这里主要写 C#,但在开发 Web 接口时,PHP 处理轻量级 XML 其实也挺快。比如遇到简单的 API 响应,可以直接用 simplexml_load_string:
$xml = simplexml_load_string($response);
$json = json_encode($xml);
$data = json_decode($json, true);
// 转成数组后,直接插库,跟 C# 逻辑是一样的
五、 避坑总结
- XML解析: 扁平数据用 LINQ,深层结构用 DOM。
- 编码: 爬虫一定要带 Encoding 参数,否则中文就是灾难。
- 数据安全: 插入 MySQL 必须用预处理语句,这是 SQL注入防护 的最后一道防线。
做完这套流程,你会发现爬虫开发其实逻辑很清晰:爬 -> 解析 -> 清洗 -> 防护 -> 入库。希望这篇文章能帮你在零点博客的开发路上少走弯路,代码如有 Bug,欢迎评论区吐槽!



评论一下吧
取消回复