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

Perl中如何将JSON转XML时把属性转为元素?满足监控系统需求

让JSON转XML输出为元素而非属性的解决方案

你遇到的问题是XML::Simple的XMLout默认会把哈希中的键值对转换成XML属性,而监控系统需要的是元素形式。只需要调整XMLout的两个参数就能解决:

修改代码中的XMLout调用

把原来的XMLout行替换成:

my $XMLOutput = XMLout($JSONOutput, NoAttr => 1, KeyAttr => []);

参数解释

  • NoAttr => 1:这个参数会强制所有数据都以子元素的形式输出,彻底禁用属性生成,这是让内容变成元素的核心开关。
  • KeyAttr => []:默认情况下XML::Simple会把某些哈希键当作索引(比如你例子里的rows数组),清空这个参数可以让数组里的每个元素都生成独立的<rows>子元素,而不会被特殊处理。

转换后的预期输出

调整后你会得到类似这样的XML,所有原来的属性都变成了对应的子元素:

<opt>
  <rowset>
    <affectedRows>444</affectedRows>
    <dbname>custom</dbname>
    <osname>SOMNI</osname>
    <tblname>tsiobm</tblname>
    <rows>
      <FirstOccurrence>1594021452</FirstOccurrence>
      <Node>host</Node>
      <RowSerial>250</RowSerial>
      <Serial>98567869</Serial>
      <Severity>5</Severity>
      <Summary>SDV134E TWS JOB=A76DT803 JOB04878 WS=PROD APPL=A76DT80S ERROR=JCL ID=DT803</Summary>
      <Status>20</Status>
      <Prob_nr>SDV134E</Prob_nr>
    </rows>
    <rows>
      <FirstOccurrence>1594130034</FirstOccurrence>
      <Node>router-ess-vpn.elber.west</Node>
      <RowSerial>329</RowSerial>
      <Serial>98639905</Serial>
      <Severity>5</Severity>
      <Summary>Tunnel2 Default Interface Ping/Default Interface Ping fail for 10.23.9.5: ICMP timeout</Summary>
      <Status>20</Status>
      <Prob_nr>SDV_IDWN</Prob_nr>
    </rows>
    <!-- 其余rows元素格式一致 -->
  </rowset>
</opt>

这个配置完全适配你给出的JSON结构,能满足监控系统对元素形式XML的要求。

内容的提问来源于stack exchange,提问作者user2213766

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:27:56