如何从外部文件获取XML变量值 解决内嵌SVG导致XML文件过大问题
可行实现方案汇总
方案1:使用XML原生外部实体(XXE)实现
这是XML标准原生支持的外部内容引用能力,无需自定义语法,兼容所有支持标准XML解析的工具:
- 引用外部文件填充属性示例写法:
<?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY svgData SYSTEM "mySvgImage.txt"> ]> <root> <!-- 替换为你的实际根节点 --> <Map map="&svgData;"/> </root>
- 注意事项:默认大部分XML解析器出于安全考虑会禁用外部实体,你需要给API对应的XML解析器开启外部实体加载的配置,才能正常使用该功能。
方案2:自定义预处理脚本(兼容性最高)
你期望的FromFile和import自定义语法可以通过前置预处理脚本实现,生成完整的合规XML后再传入软件API使用,完全不需要修改API本身的XML解析逻辑:
- 实现逻辑:用Python/JS等写几十行的简单脚本,遍历XML文本中的两类占位符:
- 匹配
FromFile("文件名")格式的字段,读取对应文件的内容,编码为base64后替换该字段值 - 匹配
import 文件名的行,读取对应XML文件的内容直接插入到该行位置
- 匹配
- 优势:无需依赖XML标准的扩展功能,也不用修改目标API的任何配置,灵活性最高,还可以自定义任意格式的占位符规则。
方案3:使用XInclude标准实现文件导入
如果你需要更规范的多XML文件导入能力,可以用W3C标准的XInclude机制,语法如下:
<?xml version="1.0"?> <root xmlns:xi="http://www.w3.org/2001/XInclude"> <!-- 导入外部XML文件 --> <xi:include href="longSvgFile.xml"/> <myChanges> ... </myChanges> </root>
- 注意事项:需要目标API的XML解析器开启XInclude支持,部分开源XML处理库默认自带该能力。
方案选择建议
如果你的软件API支持修改XML解析器配置,优先选方案1或者方案3,直接用标准语法不用额外开发;如果API的XML解析逻辑不可修改,直接选方案2的预处理脚本,成本最低。
内容的提问来源于stack exchange,提问作者Matt Schramm
相关产品推荐
相关产品推荐

