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
相关产品推荐
相关产品推荐

