libxmljs是Node.js中基于libxml2引擎开发的原生扩展库,能够高效处理XML和HTML文档的解析、修改、查询等操作,支持XPath语法,适合需要频繁操作结构化文档的场景。

环境准备与安装
libxmljs是原生模块,安装时需要本地有编译环境,Windows用户建议提前安装Visual Studio构建工具,macOS用户需要安装Xcode命令行工具,Linux用户需要安装libxml2开发包和编译工具链。
安装命令如下:
# 安装libxmljs库 npm install libxmljs
核心功能使用
解析XML文档
libxmljs支持从字符串或文件解析XML文档,解析成功后会返回文档对象,后续所有操作都基于这个对象展开。
字符串解析示例:
const libxmljs = require('libxmljs');
// 待解析的XML字符串
const xmlString = `<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title>Node.js实战</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>39.9</price>
</book>
</bookstore>`;
// 解析XML字符串,第二个参数为解析选项,这里开启不合并空白节点的选项
const xmlDoc = libxmljs.parseXml(xmlString, { noblanks: true });
console.log('解析成功,文档根节点名称:', xmlDoc.root().name());
节点操作
获取到文档对象后,可以获取、修改、新增、删除节点,以下是常用操作示例:
const libxmljs = require('libxmljs');
const xmlString = `<bookstore><book><title>测试书籍</title></book></bookstore>`;
const xmlDoc = libxmljs.parseXml(xmlString);
// 获取根节点
const root = xmlDoc.root();
console.log('根节点名称:', root.name());
// 获取子节点
const bookNode = root.child(0);
const titleNode = bookNode.child(0);
console.log('书籍标题:', titleNode.text());
// 修改节点文本
titleNode.text('修改后的书籍标题');
console.log('修改后的标题:', titleNode.text());
// 新增子节点
const priceNode = new libxmljs.Element(xmlDoc, 'price');
priceNode.text('49.9');
bookNode.addChild(priceNode);
// 删除节点
bookNode.removeChild(titleNode);
// 输出修改后的XML内容
console.log('修改后的XML:', xmlDoc.toString());
XPath查询
libxmljs支持XPath 1.0语法,可以快速定位符合条件的节点,以下是查询示例:
const libxmljs = require('libxmljs');
const xmlString = `<bookstore>
<book category="编程">
<title>Node.js实战</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>39.9</price>
</book>
</bookstore>`;
const xmlDoc = libxmljs.parseXml(xmlString, { noblanks: true });
// 查询所有book节点
const allBooks = xmlDoc.find('//book');
console.log('所有书籍数量:', allBooks.length);
// 查询category为编程的book节点
const codingBooks = xmlDoc.find('//book[@category="编程"]');
console.log('编程类书籍标题:', codingBooks[0].get('title').text());
// 查询价格大于50的书籍
const expensiveBooks = xmlDoc.find('//book[price > 50]');
expensiveBooks.forEach(book => {
console.log('高价书籍标题:', book.get('title').text());
});
HTML文档处理
libxmljs也可以解析HTML文档,不过需要使用parseHtml方法,HTML解析的容错性更强,适合处理不规范的HTML内容。
const libxmljs = require('libxmljs');
// 待解析的HTML字符串
const htmlString = `<html>
<body>
<div class="content">
<p>第一段内容</p>
<p>第二段内容</p>
</div>
</body>
</html>`;
// 解析HTML文档
const htmlDoc = libxmljs.parseHtml(htmlString);
// 查询所有p标签
const pNodes = htmlDoc.find('//p');
console.log('p标签数量:', pNodes.length);
pNodes.forEach((p, index) => {
console.log(`第${index + 1}段内容:`, p.text());
});
注意事项
- libxmljs是原生模块,不同Node.js版本可能需要匹配对应的库版本,安装失败时可以查看官方文档的版本兼容说明。
- 解析不可信的外部XML/HTML内容时,建议关闭外部实体加载,避免XXE漏洞,可以在解析选项中设置
noent: false。 - 操作节点时如果节点不存在,
get方法会返回null,需要先做非空判断再调用后续方法,避免出现运行时错误。