Dyalog APL:含命名空间字段的对象数组转XML,XmlMat函数如何编写?
处理带命名空间字段的Dyalog APL对象转XML实现
需求说明
我们需要编写XmlMat函数,处理包含命名空间类型字段的对象数组(比如示例中People类的Phone字段是命名空间,包含Work、Home子属性),将其序列化为XML格式并写入文件。
实现方案
核心思路是递归遍历对象的所有字段:
- 普通值类型字段直接生成对应XML标签
- 命名空间类型字段则递归生成嵌套的XML子标签
- 对对象数组中的每个元素,生成同级XML节点
完整代码实现
1. 定义带命名空间字段的People类
:Class People :Field Public Type ← 'contact' :Field Public Name ← ⍬ :Field Public Company ← ⍬ :Field Public Position ← ⍬ :Field Public Fax ← ⍬ :Field Public Email ← ⍬ :Field Public Phone ← ⎕NS⍬ ∇ make args :Access Public :Implements Constructor (Name Company Position)←args ⎕←'已创建新人员对象' ∇ :EndClass
2. 构建测试数据
Peoples ← (⎕New People ('Name1' 'Company1' '创始人')) (⎕New People ('Name2' 'Company2' '创始人')) Peoples[2].Phone.Work ← '12124523' Peoples[2].Phone.Home ← '4323325'
3. 实现XmlMat函数(支持嵌套命名空间)
∇ XmlMat objArr;xmlHeader;objXml;fieldNames;fieldVal;tagName;childXml :Access Public xmlHeader ← '<?xml version="1.0" encoding="UTF-8"?>' objXml ← '' :For obj :In objArr objXml,← '<Person>' fieldNames ← ⎕NL obj ⍝ 获取对象的所有公共字段名 :For fn :In fieldNames fieldVal ← obj.(fn) tagName ← fn :If 9=⎕NC fieldVal ⍝ 判断字段是否为命名空间类型 childXml ← '' :For subFn :In ⎕NL fieldVal childXml,← '<',subFn,'>',fieldVal.(subFn),'</',subFn,'>' :EndFor objXml,← '<',tagName,'>',childXml,'</',tagName,'>' :Else :If fieldVal≢⍬ ⍝ 仅处理非空字段 objXml,← '<',tagName,'>',fieldVal,'</',tagName,'>' :EndIf :EndIf :EndFor objXml,← '</Person>' :EndFor ⍝ 组合完整XML并写入文件 fullXml ← xmlHeader,⊂'<People>',objXml,'</People>' ⎕NPUT 'people.xml' 1 fullXml ⎕←'XML文件已生成:people.xml' ∇
4. 调用函数生成XML
XmlMat Peoples
生成的XML示例
<?xml version="1.0" encoding="UTF-8"?> <People> <Person> <Type>contact</Type> <Name>Name1</Name> <Company>Company1</Company> <Position>创始人</Position> <Phone></Phone> </Person> <Person> <Type>contact</Type> <Name>Name2</Name> <Company>Company2</Company> <Position>创始人</Position> <Phone> <Work>12124523</Work> <Home>4323325</Home> </Phone> </Person> </People>
关键细节说明
- 用
⎕NL获取对象/命名空间的字段列表,⎕NC判断字段类型(9代表命名空间) - 通过递归逻辑处理嵌套的命名空间字段,生成对应嵌套XML标签
- 跳过空值字段,可根据需求调整是否保留空标签
- 使用
⎕NPUT写入文件,参数1代表覆盖已有文件
内容的提问来源于stack exchange,提问作者конструктор
相关产品推荐
相关产品推荐

