
本文详解如何在 BaseX 等 XML 处理环境中,将 JSON 输入中含 HTML 标签的字符串(如 "...")不转义地解析为真实 XML 子节点,而非默认的 实体文本,并提供可运行的 XQuery 示例与关键注意事项。
本文详解如何在 basex 等 xml 处理环境中,将 json 输入中含 html 标签的字符串(如 `"
...
"`)**不转义地解析为真实 XML 子节点**,而非默认的 `
` 实体文本,并提供可运行的 XQuery 示例与关键注意事项。
在使用 BaseX 的 json:parse() 函数解析 JSON 数据时,HTML 字符串(如 "text": "<p><em>...</em></p>")会被自动转义为 XML 实体(<p><em>...</em></p>),这是 XML 规范的默认安全行为:防止内容与结构混淆。但当业务需要将这些 HTML 片段作为合法子元素嵌入最终 XML 文档(例如生成富文本 XHTML 输出、构建可渲染的文档树),就必须显式执行“字符串 → XML 片段”的二次解析。
核心思路是:先用 json:parse() 得到基础 XML 结构,再通过 XQuery 更新(update)操作,对目标字段(如 text)的文本节点调用 parse-xml-fragment(),将其内容解析为实际 XML 节点并替换原字符串。
✅ 正确实现示例(BaseX 10.7+):
let $json := '{ "order": 2, "page_id": 27, "text": "<p><strong>Présentation générale</strong></p><p>L’ambon...</p>" }'
let $xml := json:parse($json)
return $xml update {
for $node in $xml/json/text/text()
return replace node $node with parse-xml-fragment($node)
}
⚠️ 关键前提与注意事项:
-
必须确保 HTML 字符串是良构(well-formed)XML 片段:
BaseX 的parse-xml-fragment()不接受 HTML5 非闭合标签(如<br>、<img>)、自闭合语法缺失(需写成<br>)、或未声明的命名空间。建议预处理:(: 安全封装:添加根容器并标准化换行/空格 :) let $safe-html := <div>{ normalize-space(replace($raw-html, '\r\n|\n\r|\r', ' ')) }</div> return parse-xml-fragment($safe-html) parse-xml-fragment()仅支持 XML,不兼容 HTML 实体(如,é):
若原始 HTML 含非 XML 标准实体(如),需提前转换为 Unicode 字符或 XML 实体(,é)。可借助fn:replace()或外部预处理工具。字段路径需精确匹配:
json:parse()默认生成<json type="object"></json>根节点,其下子元素名直接映射 JSON 键名(如"text"→<text></text>)。若键名含特殊字符(如-、@),BaseX 会自动转义为page__id等形式,务必用$xml/json/page__id/text()访问。性能提示:
对大批量 JSON 文件批量处理时,避免在循环内重复调用parse-xml-fragment()。建议先收集所有待解析 HTML 字符串,统一校验/清洗后批量注入。
? 进阶技巧:封装为可复用函数
declare function local:html-to-xml-node($json-str as xs:string, $field as xs:string) as element() {
let $xml := json:parse($json-str)
let $target := $xml/json/*[local-name() = $field]/text()
return
if (exists($target)) then
$xml update {
replace node $target with parse-xml-fragment(<div>{$target}</div>)
}
else $xml
};
(: 调用示例 :)
local:html-to-xml-node($my-json, "text")
总结:JSON 到 XML 的转换本身不难,但当 JSON 值内嵌 HTML 时,“是否转义”成为语义分水岭。BaseX 提供了 parse-xml-fragment() 这一精准可控的桥梁——它不改变 JSON 解析逻辑,而是在 XML 层面完成“内容升格”。只要确保输入 HTML 片段符合 XML 语法规范,即可安全、高效地实现 HTML 字符串到原生 XML 节点的跃迁。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











