扩展库 / rss
rss
RSS 2.0 与 Atom 订阅源。
解析、识别与生成常用 feed 字段。底层复用 Expat/XML DOM,不接受 DTD 或外部实体;解析后归还临时 DOM 的保留引用,不让重复读取逐次积累文档。
API
| 函数 | 用途 |
|---|---|
detect / parse | 识别并解析 RSS 2.0 或 Atom |
parseRSS / parseAtom | 限定格式解析 |
buildRSS / buildAtom | 由对象和条目数组生成 XML |
范例
import rss
func main(...) as int
string xml = ("<feed xmlns='http://www.w3.org/2005/Atom'>" +
"<link rel='self' href='https://example.test/feed'/>" +
"<link rel='http://www.iana.org/assignments/relation/alternate' href='https://example.test/'/></feed>")
var feed = rss.parseAtom(xml)
assert feed["link"] == "https://example.test/"
println(feed["link"])
return 0
end
detect 对无效格式或超限输入返回空字符串,内存不足则报错;C 调用方可检查 XRT 错误。解析输入恰好 8 MiB 可读取,超一字节时 C 报 XERR_RANGE、XLang 抛 RangeError。RSS 根节点必须写 version="2.0",缺失或旧版本不作为 RSS 2.0 解析。生成 RSS 时 channel 需有 title/link/description;生成 Atom 时 feed 需有 id/title/updated,entry 需有 id/title/updated、作者与 content 或 link,作者可继承 feed。解析后 entry.author 是有效作者,优先级为 entry、entry.source、feed;扁平结果不保留作者来源。解析器仍宽容读取字段不完整的文档。生成器校验 XML 1.0 字符范围,拒绝 U+FFFE/U+FFFF;元素文本的 CR 和 Atom link 属性的 Tab/LF/CR 使用字符引用,回读不会因 XML 空白规范化变值;本包不校验链接 IRI。XML 正文恰好 16 MiB 可输出,超一字节时 C 接口报告 XERR_RANGE,不会截断;末尾 NUL 不计入正文限额。Atom 作者继承有独立的 examples/atom_author.xl 与 examples/atom_author_c.c,分别执行 XLang 和 C 后再对照输出。Windows 包内 test/check.ps1 默认覆盖严格 C、C/XLang 边界、双语对照、核心 AOT 及带输出范例 AOT;Linux test/check.sh 同次覆盖 C ASan/UBSan、XLang 用例及双语对照。当前发布版的最小 rss.buildRSS(channel, []) 用例因语言字典和数组未投影为原生对象与数组而抛 ValueError;历史 C/双语测试记录不能代替本版验收。完整语言与 AOT 门禁待共享容器投影修复后重跑,旧版 xl6ValueDataSnapshotV1 缺符号不是当前阻断。输入限制、所有权及复现见包内 README。
Atom 的 link 未设置 rel 时按 alternate 处理;短名称与完整 http://www.iana.org/assignments/relation/alternate 等价。feed 和 entry 都优先选择第一个 alternate 链接,没有时才回退到第一个 href;只匹配 Atom 直接子元素,不做任意 IRI 归一化。依据 RFC 4287。2026-10-30 双平台新增 80 场景、668 个真实 OOM、C/XLang JIT/AOT 与固定黄金输出通过;默认完整门禁仍因 M1 失败,不签收整包。包内 examples/atom_links.xl 与 examples/atom_links_c.c 展示同一能力。