如何通过jq转义XML字符串并将其作为值合并到JSON中?
解决jq将转义后的XML合并到JSON的问题
我来帮你搞定这个jq命令的问题!你想要的是把XML文件内容转义成XML实体后,作为新字段合并到现有JSON里,之前的命令出错主要是因为选项搭配错误和变量引用方式不对,下面给你正确的方案:
正确命令(XML内容在文件中)
假设你的JSON字符串存在变量$JSON_STRING,XML文件路径是$XML_FILENAME,用这条命令就能得到你想要的结果:
echo "$JSON_STRING" | jq --rawfile xml_content "$XML_FILENAME" '.xml = ($xml_content | @html)'
命令解释
--rawfile xml_content "$XML_FILENAME":把指定XML文件的完整内容(包括换行、特殊字符)以原始字符串的形式读取到jq变量$xml_content中,避免了处理数组的麻烦(之前用--slurpfile会把文件内容存为数组,需要取[0]才能拿到完整内容,--rawfile更适合文本文件场景)。.xml = ($xml_content | @html):在原JSON对象中新增xml字段,通过@html过滤器自动转义XML特殊字符——比如<转成<,"转成",完全符合你的需求。
如果XML内容在变量中(而非文件)
如果你的XML内容已经存在变量$XML_FILE_CONTENT里,可以用--arg选项直接传入变量内容,不需要读文件:
echo "$JSON_STRING" | jq --arg xml_content "$XML_FILE_CONTENT" '.xml = ($xml_content | @html)'
之前命令的错误点解析
你之前的命令主要有这些问题:
- 错误使用
--raw-input:这个选项会让jq把标准输入的JSON字符串当成纯文本处理,而不是解析为JSON对象,自然无法执行添加字段的操作。 - 变量引用方式错误:第一个命令里的
"($XML_CONTENT)"是把括号和变量名当成了字符串字面量,没有实际引用到读取的XML内容,所以会得到错误的字符串值。 - 选项搭配冲突:第三个命令的
--raw-input和JSON解析需求冲突,去掉这个选项才能正确处理原JSON结构。
验证结果
用你的示例内容测试:
- XML文件内容:
<blah abc="def">123</blah> - 原始JSON:
{ "thj": "abc" }
执行命令后会输出:
{ "thj": "abc", "xml": "<blah abc="def">123</blah>" }
完全符合你期望的结果。
内容的提问来源于stack exchange,提问作者monch1962
相关产品推荐
相关产品推荐

