拒绝盲目爬取:C# XML解析底层逻辑与实战避坑指南

最近在做零点博客的一个数据迁移项目时,接触了不少老旧的API接口,它们虽然不如JSON灵活,但仍然是很多爬虫爬取数据的基础。很多人习惯用正则表达式去匹配XML标签,这绝对是新手最容易踩的坑。今天就跟大家聊聊在C#开发中,如何正确、高效地进行XML解析,以及如何将解析后的数据安全入库。

为什么我们还在用XML?

在Web开发中,HTML由标签堆叠而成,DOM结构混乱;而XML像JSON一样,拥有清晰的树状结构。如果你在开发PHP后端或者对接EMLOG接口时,经常会遇到需要处理XML的场景。相比于JSON,XML在数据校验(Schema)和传输历史兼容性上更有优势。

C#解析XML的两种主流姿势

在C#中,最常用的无非两种:一种是传统的XmlDocument,一种是现代的LINQ to XML。

1. 使用 XDocument(推荐)

这东西用起来特别像操作JSON,代码简洁,适合解析结构较规整的数据。比如我们抓取到一个RSS流:

string xmlString = @"<rss version="2.0">
    <channel>
        <title>零点博客测试</title>
        <item>
            <title>C#进阶</title>
            <link>http://www.example.com</link>
        </item>
    </channel>
</rss>";

var doc = XDocument.Parse(xmlString);
var title = doc.Descendants("item").FirstOrDefault()?.Element("title")?.Value;
Console.WriteLine(title);

2. XmlDocument 遍历法

如果你面对的是几兆大小的超大XML文件,内存敏感,那就要用XmlDocument。它的SelectNodes配合XPath简直就是神器。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
XmlNodeList nodes = xmlDoc.SelectNodes(@"//channel/item");
foreach (XmlNode node in nodes)
{
    string link = node.SelectSingleNode("link").InnerText;
    // 处理数据...
}

实战避坑:从解析到入库(MySQL与SQL注入)

解析完数据只是第一步。假设我们爬取了1000条商品信息,最终要存入MySQL。这时候很多同学最容易犯的错就是拼接SQL字符串,这在处理XML解析出来的特殊字符时非常危险。

绝对不要这样做(高风险):

string sql = $"INSERT INTO products (name, price) VALUES ('{itemName}', {price})";

如果XML内容里包含单引号,你的程序直接崩了。正确做法是使用预处理语句,配合参数化查询。无论XML里有什么字符,数据库都把它当成普通文本处理。

总结

做后端开发,技术选型要务实。能用XDocument解决的就别用正则表达式瞎搞。本文的源码案例已经适配了.NET Core环境,大家可以直接拿去跑。下次写爬虫时,记得先判断Content-Type,遇到XML就老老实实走解析流程,别偷懒。