MATLAB中存在三个易混淆的IRIS:鸢尾花数据集(内置机器学习示例)、InterSystems IRIS数据库平台(多模型企业级数据平台)和IRIS地震数据服务;三者领域、用途与技术栈完全不同,需先明确所指对象再开展相应操作。

IRIS 而不是 Iris:别混淆框架和平台
很多人搜“Iris XML 输出”时,实际要的是 InterSystems IRIS 的 XML 序列化能力——不是 Go 语言的 iris Web 框架。Go 的 iris 框架本身不内置 XML 渲染逻辑,需手动构造响应;而 InterSystems IRIS 是企业级数据平台,原生支持对象到 XML 的投影与转换。如果你在写 REST API 并希望返回 XML,先确认你用的是哪个:
- 用
iris.New()启动服务 → 是 Go 框架,XML 需自己用xml.Marshal()+http.ResponseWriter写 - 类定义里有
%Persistent或调用%XMLExport()→ 是 InterSystems IRIS,走的是平台级 XML 工具链 - 看到
LogicalToXSD()、XSDToLogical()方法 → 只可能出现在 IRIS 类中
IRIS 中输出 XML:靠 %XML.Adaptor 和 %XML.Writer
IRIS 不靠“配置文件”或“注解”生成 XML,而是通过类继承和方法调用控制行为。核心是让类支持 %XML.Adaptor,再用 %XML.Writer 实例写出:
- 类必须继承
%XML.Adaptor(或其子类如%SerialObject),否则%XMLExport()会报错<error>5001: Class 'MyClass' does not support XML</error> - 字符串属性默认转义
&、、<code>>等字符;若不想转义(比如存的是已格式化的 HTML 片段),需设属性参数ESCAPE = "NONE" - 流类型(
%Stream.GlobalCharacter)会被自动 Base64 编码为文本节点;二进制流则转成 Base64 字符串,不额外包装 - 导出时若需指定编码(如 UTF-8)、缩进、是否带 XML 声明,得用
%XML.Writer,而不是直接调%XMLExport()
示例片段:
set writer = ##class(%XML.Writer).%New()
set writer.Indent = 1
set writer.CharSet = "UTF-8"
do writer.OutputToFile("output.xml")
do obj.%XMLWrite(writer)
jms/serializer 或其他 PHP/Java 库不适用于 IRIS 类
像 jms/serializer 的 XML 配置(<property name="createdAt" xml-attribute="true"></property>)对 IRIS 无效。IRIS 的 XML 映射由类定义本身驱动,不是外部元数据:
-
xml-root-name对应 IRIS 类的XMLNAME参数:Parameter XMLNAME = "order"; -
xml-attribute="true"对应属性参数:Property CreatedAt As %DateTime [ XMLAttribute ]; -
xml-value="true"对应:Property Content As %String [ XMLValue ]; - 没有
exclusion-policy这种全局开关;字段是否导出由XMLPROJECTION参数控制,默认为"ELEMENT",设为"NONE"即排除
复杂嵌套结构的关键控制点:流、集合、命名空间
当对象含列表(%List)、数组(%ArrayOfDataTypes)或关联对象时,XML 输出容易失真。常见问题和对策:
- 集合属性默认生成同名重复元素(如多个
<item></item>),但若想包一层<items></items>容器,需定义中间类并设XMLPROJECTION = "ELEMENT",不能只靠参数 - 字符流(
%Stream.GlobalCharacter)内容默认作为文本节点内联;若内容含非法 XML 字符(如未转义的&),IRIS 仍会按规则转义——这不是 bug,是ESCAPE = "XML"的预期行为 - 命名空间需在类级别声明:
Parameter NAMESPACE = "https://example.com/order";,且所有子对象类也需显式声明,否则子元素无 namespace 前缀 - 时间戳、二进制等类型依赖
LogicalToXSD(),若重写了该方法,务必同步更新XSDToLogical(),否则导入会失败
最易被忽略的一点:IRIS 导出 XML 时不会验证 XSD 是否匹配,只有在用 %XMLImport() 加载带 schema 的文档时才校验。所以开发期要主动用 %XML.Schema 类生成或比对 schema,别等到下游系统拒收才排查。


















