埃克斯姆尔
用于JavaScript和TypeScript的快而轻快的XML/HTML解析器,序列器和流线工具箱. 只导入您需要的东西, 树解析, SAX流化, 对象转换, 或串行化, 各自作为独立导出 .
建于与 tXml 数据 由Tobias Nickel(英语:Tobias Nickel)所制作,Eksml改进了性能并扩展了附加功能.
安装
pnpm add @eksml/xml
# or: npm install @eksml/xml / yarn add @eksml/xml
埃克斯姆尔是 仅限无害环境管理 并需要Node.js 18+(或任何现代浏览器,Deno,或Bun). 没有通用JS出口.
分析
parse() 将 XML 字符串转换成一系列的平面对象节点 :
import { parse } from '@eksml/xml/parser';
const dom = parse('<feed><item id="1">Hello</item></feed>');
// [
// {
// tagName: 'feed',
// attributes: null,
// children: [
// { tagName: 'item', attributes: { id: '1' }, children: ['Hello'] },
// ],
// },
// ]
每一个元素都是 TNode, (中文(简体) ), { tagName, attributes, children },文本是一个简单的字符串。 这是整个树型, 它是JSON的系列 并且安全的克隆.
更喜欢用简单的物体而不是树? 直接转换 :
import { lossy } from '@eksml/xml/lossy';
lossy('<user><name>Alice</name><age>30</age></user>');
// => { user: { name: 'Alice', age: '30' } }
见 解析 用于所有选项(HTML模式、严格模式、实体解码、目标提取)和 转换器 用于丢失和无损对象格式.
写入
write() 将树(或丢失/ 丢失的对象, 自动检测) 序列化为字符串 :
import { write } from '@eksml/xml/writer';
write(dom);
// => '<feed><item id="1">Hello</item></feed>'
write(dom, { pretty: true });
// => '<feed>\n <item id="1">Hello</item>\n</feed>'
write({ user: { name: 'Alice' } });
// => '<user><name>Alice</name></user>'
见 写作 用于漂亮打印、实体编码、 HTML 输出和验证选项.
流线
对于太大的文档 存储,或数据到达网络, XmlParseStream 是一个标准网络 TransformStream 并释放出完成的子树:
import { XmlParseStream } from '@eksml/xml/stream';
const response = await fetch('/feed.xml');
const nodes = response.body
.pipeThrough(new TextDecoderStream())
.pipeThrough(new XmlParseStream({ select: 'item' }));
for await (const item of nodes) {
console.log(item.tagName); // each <item> as soon as it closes
}
这个 select 选项会逐一释放匹配元素,而不是等待整个文档。 在浏览器、Node.js 18+、 Deno 和 Bun 工作; 节点流桥与 Readable.toWeb()。 。 。 .
如果您想要原始事件而不是树(或最大吞吐量), 也有一个事件Emitter风格的 SAX 解析器 :
import { createSaxParser } from '@eksml/xml/sax';
const parser = createSaxParser();
parser.on('openTag', (tagName, attributes) => console.log(tagName));
parser.write('<feed><item id="1">');
parser.write('Hello</item></feed>');
parser.close();
见 网络流 财务报告和审定财务报表 SAX 解析器 用于选项、输出格式和节点流接口.
文档
| 专题 | 封面 |
|---|---|
| 分析 | parse(),所有选项 TNode 树型、严格模式、实体解码、定向取出 |
| 写入 | write(),漂亮打印,实体编码,验证,输入自动检测 |
| 网页流 | XmlParseStream,则 select 选项、 输出格式、 块缓冲、 节点接口 |
| SAX 解析器 | createSaxParser(),事件,动态处理器,使用节点流 |
| 转换器 | lossy(), (中文(简体) ), lossless(),形状规则,回转 XML |
| 公用事业 | filter(), (中文(简体) ), getElementById(), (中文(简体) ), getElementsByClassName(),类型守护, HTML 常数 |
| HTML 支持 | 什麽 html: true 在每一个 API 中执行,在 Eksml 停止缺少符合 spec 的 HTML 解析器时执行 |
| 警卫 | 原型污染和循环参考保护,为何亿取笑和XXE不适用 |
| 限制 | 没有 DTD/ schema 验证, 没有命名空间分辨率, 没有 XPath, 以及工作环 |
基准
Eksml 始终是 DOM 解析、 SAX 流化和原始符号化 中最快的 JavaScript 库, 并引导序列化 validate: false. 完整的每个固定结果: 银行。 。 。 .
还有一个 交互式基准 在您的浏览器中运行。 它与BENCHMARKS.md是一个单独的套房:它只包括运行在网络上的库,并使用自有固定装置(或用XML你粘贴来),因此其数字不具有直接可比性.
承认
Eksml的DOM解析器是建立在 托比亚斯镍 他的电话 tXml 数据 图书馆。 核心解析架构,一个单行道,位置跟踪的字符串扫描仪,可以随行地构建树,是使得两个库都如此快. 托比亚斯,谢谢你的优雅方法 使这一切成为可能.
许可证
麻省理工学院