You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者конструктор

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:28:27