尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Kotlin/Android 批量文档抽取的 URI 容错实践:用 Xberg extractBatch 处理不存在的输入
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本篇指南围绕 XbergRust 核心的多语言文档智能提取库在 Kotlin/Android 场景下的extractBatch批量抽取接口展开重点解决输入列表中某个 URI 指向不存在的文件时批量任务应如何表现、如何读取结果这一实战问题。读完本文你将掌握ExtractInput与ExtractionConfig的序列化写法、extractBatch的底层调用链Kotlin 绑定 → FFI → Rust 核心以及借助summary.results/summary.errors对批量结果做逐项判定与容错的方法。场景批量抽取时遇到文档不存在在真实业务中批量文档抽取如定时任务扫描一批本地路径、或从消息队列拿到一批待解析的文件地址经常会出现个别输入失效的情况文件被移动、删除、URL 过期或权限变更。如果整个批量调用因单个坏输入而整体失败会带来大量不必要的重试反之如果静默吞掉错误又会让数据质量无法被观测。仓库中的自动化契约用例extract_batch_uri_not_found正是对这一场景的明确规定。它的描述fixtures/batch/extract_batch_uri_not_found.json只有一句话extract_batch with missing URI input——即向批量抽取接口传入一个不存在的 URI。它同时给出了三条断言assertions: [ { type: not_error }, { type: equals, field: summary.results, value: 0 }, { type: equals, field: summary.errors, value: 1 } ]这三条断言精确刻画了 Xberg 的容错契约调用本身不抛异常not_error但结果统计中成功数为 0、错误数为 1。也就是说批量 API 把输入不存在建模为批内单条失败而不是批级失败。Kotlin/Android 的示例代码docs-site/src/snippets-generated/kotlin-android/batch/extract_batch_uri_not_found.md完整演示了这一行为。完整示例向 extractBatch 传入不存在的 URI原文档给出了可直接运行的最小 Kotlin 代码这里完整保留并逐步解读import io.xberg.* import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper fun main() kotlinx.coroutines.runBlocking { val mapper jacksonObjectMapper().setPropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategies.SNAKE_CASE) val configDefault mapper.readValue({\url\:{\crawl\:{\ssrf\:{}}}}, ExtractionConfig::class.java) val result Xberg.extractBatch(listOf(mapper.readValue({\kind\:\uri\,\uri\:\/nonexistent/a.pdf\}, ExtractInput::class.java)), configDefault) println(result.summary.results) println(result.summary.errors) }各环节的作用jacksonObjectMapper() SNAKE_CASEXberg 各语言绑定统一使用 snake_case 的 JSON 协议与 Rust 核心通信因此 mapper 必须设置为PropertyNamingStrategies.SNAKE_CASE否则mimeType、remoteUrls这类字段无法正确映射。configDefault一份几乎为空的默认配置仅声明了{url:{crawl:{ssrf:{}}}}。它表明当输入为 URI 并触发 URL 爬取时需要应用 SSRF服务端请求伪造防护策略空对象{}表示采用策略的默认值。在 C FFI 头文件crates/xberg-ffi/include/xberg.h中可以看到CrawlConfig暴露了ssrf字段对应的SsrfPolicy至少包含deny_private、allowlist、max_redirects、scheme_allowlist四个维度即默认策略会约束允许访问的协议、禁止访问私网地址、限制重定向次数。ExtractInput输入{kind:uri,uri:/nonexistent/a.pdf}声明一个 URI 类型的输入指向一个不存在的本地绝对路径。字段定义见 ExtractInput.ktkind取bytes或uri默认URIuri可以是本地路径、file://URI 或 HTTP(S) URL此外还支持bytes、mimeType、filename、config等可选字段。println(result.summary.results / errors)直接打印批量汇总的成功数与错误数。按契约断言此处应输出0和1。底层调用链Kotlin 绑定如何抵达 Rust 核心extractBatch不是 Kotlin 侧的本地实现而是通过 JNI 桥接到 Rust 核心。实现位于 packages/kotlin-android/src/main/kotlin/io/xberg/Xberg.kt/** Extract content from multiple bytes or URI inputs. */ fun extractBatch(inputs: ListExtractInput, config: ExtractionConfig): ExtractionResult { val resultJson XbergBridge.nativeExtractBatch( mapper.writerFor(mapper.typeFactory.constructCollectionType( List::class.java, ExtractInput::class.java)).writeValueAsString(inputs), mapper.writeValueAsString(config)) return mapper.readValue(resultJson, ExtractionResult::class.java) }从源码结构看整个调用路径是调用方构造ListExtractInput与ExtractionConfigXbergBridge.nativeExtractBatch把输入列表与配置序列化为 JSON经 JNI 传给 Rust 侧Rust 核心逐条解析输入、执行格式探测与抽取支持 106 种格式 / 140 种扩展名、371 种语言的代码智能见项目根目录 README.md任一输入失败不会中断整批处理而是被记入批级统计结果 JSON 返回后在 Kotlin 侧反序列化为ExtractionResult其summary字段类型定义于 ExtractionSummary.kt。批级统计字段读懂 summary 的每一个数字ExtractionResultpackages/kotlin-android/src/main/kotlin/io/xberg/ExtractionResult.kt中summary: ExtractionSummary是理解批量结果的唯一入口其统计字段如下字段类型含义inputsLong本批接收到的输入总数resultsLong成功完成抽取的输入数errorsLong失败输入数remoteUrlsLong涉及远程 URL 下载的输入数pagesCrawledLong爬取网页时累计访问的页面数documentsDownloadedLong实际下载成功的文档数在本例中输入列表只有 1 项inputs 1文件不存在导致results 0、errors 1。这三者之间的关系inputs results errors的边界情况是批量任务状态机的基础只要errors 0就说明至少有一条输入需要排查而results对应的成功文档仍可正常消费二者互不阻塞。实战要点在生产代码中正确处理批内失败结合上述契约在 Android/Kotlin 项目中落地批量抽取时建议遵循以下模式不要用 try/catch 吞掉整批调用。契约明确not_error——URI 不存在这类输入级错误不会抛异常抛异常的通常是配置校验、网络栈或序列化层面的批级错误二者要区分处理。每次调用后检查summary.errors。若errors 0应把本批的ExtractInput列表与summary关联起来做补偿记录日志、进入重试队列或标记人工处理。成功文档照常消费。results不为 0 时对应的抽取结果仍然有效不必因个别失败丢弃整批产物。对 URI 输入保持 SSRF 默认防护。当输入可能来自不可信来源如用户提交的 URL时保留url.crawl.ssrf的默认策略避免内部服务被当作跳板本地路径类输入不触发爬取路径不受此影响。注意 JSON 字段命名。所有绑定的对外协议均为 snake_caseKotlin 侧务必配置 SNAKE_CASE 命名策略否则mime_type、page_count等字段会映射失败造成看似成功实则空结果的假象。相关文件速查契约用例定义与断言fixtures/batch/extract_batch_uri_not_found.jsonKotlin/Android 示例片段本文主体来源docs-site/src/snippets-generated/kotlin-android/batch/extract_batch_uri_not_found.mdextractBatch绑定实现Xberg.kt输入模型定义ExtractInput.kt结果与批级统计ExtractionResult.kt、ExtractionSummary.ktSSRF 策略的 C FFI 暴露xberg.h同一契约在仓库的其余 14 种绑定Java、Swift、Go、Python、Ruby、Rust、C#、Dart、Elixir、PHP、TypeScript、Wasm、Zig、C中均有对应片段见 docs-site/src/snippets-generated 下各语言目录本指南的语义与实现路径同样适用于它们——差异仅在于各语言的 JSON 映射方式与调用语法。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg Java 批量提取容错实战extractBatch 处理不存在的 URI 输入xberg Java 批量提取容错实战extractBatch 处理不存在的 URI 输入 本文围绕 xberg 官方契约示例 extract_batch_u后端AI 应用NLPKotlin/Android 中调用 Xberg extractBatch 批量 URI 文档抽取的完整实践指南Kotlin/Android 中调用 Xberg extractBatch 批量 URI 文档抽取的完整实践指南 导读 本文以 Xberg 项目 Kotlin/后端AI 应用NLPGo 批量抽取的部分失败处理xberg ExtractBatch 在 URI 输入损坏时的容错实践Go 批量抽取的部分失败处理xberg ExtractBatch 在 URI 输入损坏时的容错实践 本篇技术指南围绕 xberg 文档库中 extract_b后端AI 应用NLP上一篇formily/reactive observe API 详解操作级监听、深/浅监听与变更事件模型下一篇RedwoodJS 实战用 dbAuth 为博客应用构建完整认证体系路由保护、登录注册与会话安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

【STM32】中断现场保护与恢复:从栈帧到 EXC_RETURN 全解析

【STM32】中断现场保护与恢复:从栈帧到 EXC_RETURN 全解析

中断现场保护与恢复:从栈帧到 EXC_RETURN 全解析 一、为什么要"现场保护"?中断是"随时插进来"的,主程序正在用一堆寄存器(R0~R12、PC、xPSR),CPU 不可能把这些寄存器都"冻结&qu…

📅 2026/10/7 2:42:04
AtCoder-arc227_a Fermat Point of Binary Strings 题解

AtCoder-arc227_a Fermat Point of Binary Strings 题解

Solution 首先考虑 distdistdist 的本质是什么。 显然有用的交换只有 01 和 10。这可以看成不断移动 SSS 中的 1。由于不交换 11&#xff0c;1 的相对顺序保持不变。 设 SSS 中 1 的位置为 s1<s2<⋯<sns_1<s_2<\dots<s_ns1​<s2​<⋯<sn​&#xff…

📅 2026/10/7 2:37:03
ExplorerPatcher:把 Windows 11 换回 Windows 10 任务栏、开始菜单与窗口切换器

ExplorerPatcher:把 Windows 11 换回 Windows 10 任务栏、开始菜单与窗口切换器

ExplorerPatcher&#xff1a;把 Windows 11 换回 Windows 10 任务栏、开始菜单与窗口切换器 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你…

📅 2026/10/7 2:37:03
MORE NEWS

更多资讯

📰

基于编辑距离的VB文本相似行比对工具实现

先交代个背景&#xff1a;上个月帮朋友处理两批业务导出数据&#xff0c;一份是前一天的系统快照&#xff0c;一份是后一天的&#xff0c;总共一万多行&#xff0c;行长几乎一样&#xff0c;区别就躲在某些字段里。拿Beyond Compare直接比&#xff0c;全是红的&#xff1b;拿Di…

📰

LM358运放打造纯硬件呼吸灯:从原理到调试的完整指南

1. 从一个经典需求说起&#xff1a;为什么要用LM358做呼吸灯呼吸灯这个效果&#xff0c;做过电子产品的人都不陌生——手机上的通知灯、路由器上的状态灯、笔记本的电源键&#xff0c;那种一亮一暗、像人在呼吸一样柔和渐变的光效&#xff0c;背后其实就是一个简单的模拟电路在…

📰

LM358呼吸灯电路从入门到精通:三角波振荡器原理与调试指南

1. 为什么LM358是呼吸灯入门的"黄金搭档"呼吸灯这个效果&#xff0c;很多人第一次见是在笔记本电脑的电源指示灯上——一亮一暗&#xff0c;像人在呼吸。看起来简单&#xff0c;但真动手做&#xff0c;你会发现它比"LED闪烁"复杂得多。闪烁只需要高低电平切…

📰

教育站群文件上传下载:分布式存储与负载均衡实战

做教育行业站群&#xff0c;越做到后面越会发现&#xff0c;文件上传下载这件事&#xff0c;远远不是写个MultipartFile接参那么简单。举一个真实场景&#xff1a;一套面向中小学的在线学习平台群&#xff0c;下面挂着主站、学科子站、题库站、作业站、直播回放站&#xff0c;课…

📰

Git实战:理解工作流,搞定提交、分支合并与SSH认证排坑

很多初学者学Git的时候&#xff0c;最容易犯的一个错误就是去背命令清单。git add、git commit、git push背得滚瓜烂熟&#xff0c;可真到项目里遇到提交错文件、分支合并不了、SSH认证失败&#xff0c;整个人就懵了。我当初也是这么过来的&#xff1a;本地写了好几天的代码&am…

📰

TensorFlow+CNN预测股票:从K线特征到滚动回测实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬