【问题标题】:How to parse array of json objects to custom XML (node.js)如何将 json 对象数组解析为自定义 XML (node.js)
【发布时间】:2021-03-09 22:07:36
【问题描述】:

我正在尝试使用 js2xmlparser (node.js) 将 JSON 对象数组转换为自定义 XML 文件。

源数组如下所示:

[
 {
   "ID": "3233705000002165882",
   "Quarter": "2020Q3",
   "Pkg_Total": "0.00",
   "Course_Each": "0.00"
 },
 {
   "ID": "3233705000002165883",
   "Quarter": "2020Q4",
   "Pkg_Total": "2.50",
   "Course_Each": "0.70"
 },
 {
   "ID": "3233705000002165884",
   "Quarter": "2021Q1",
   "Pkg_Total": "34.00",
   "Course_Each": "15.00"
 }
]

我需要目标 XML 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <records>
        <record id="3233705000002165882">
            <column name="Quarter">
                <value><![CDATA[2020Q3]]></value>
            </column>
            <column name="Pkg_Total">
                <value><![CDATA[$ 0.00]]></value>
            </column>
            <column name="Course_Each">
                <value><![CDATA[$ 0.00]]></value>
            </column>
        </<record>
        <record id="3233705000002165883">
            <column name="Quarter">
                <value><![CDATA[2020Q4]]></value>
            </column>
            <column name="Pkg_Total">
                <value><![CDATA[$ 2.50]]></value>
            </column>
            <column name="Course_Each">
                <value><![CDATA[$ 0.70]]></value>
            </column>
        </<record>
        <record id="3233705000002165884">
            <column name="Quarter">
                <value><![CDATA[2021Q1]]></value>
            </column>
            <column name="Pkg_Total">
                <value><![CDATA[$ 34.00]]></value>
            </column>
            <column name="Course_Each">
                <value><![CDATA[$ 15.00]]></value>
            </column>
        </<record>
   </<records>
</response>

关于如何配置 js2xmlparser 来执行此操作的任何建议?或者是否有另一个 node.js 实用程序可以帮助完成这个转换任务?谢谢!

【问题讨论】:

    标签: json xml transform


    【解决方案1】:

    我通过编写自己的自定义函数解决了这个问题:

        const json2XML = async (jsonFilePathName) => {
            const jsonObj = await loadDataObj(jsonFilePathName)
            let xmlRecords = '';
            let xmlRecordBegin = '';
            let xmlRecordFull;
            jsonObj.forEach((newRecord) => {
                const fieldNames = Object.keys(newRecord);
                let colElements = '';
                let colElement;
                let colValue;
                xmlRecordBegin = `<record id="${newRecord.ID}">`;
                fieldNames.forEach((fieldName) => {
                    //iterate through all fieldNames except ID
                    if (fieldName !== 'ID') {
                        colValue = newRecord[fieldName];
                        colElement = `<column name="${fieldName}"><value><![CDATA[${colValue}]]></value></column>`;
                        colElements = colElements + colElement;
                    }
                });
                //end fieldNames.forEach((fieldName)
                xmlRecordFull = xmlRecordBegin + colElements + '</record>';
                //console.log('xmlRecordFull = ', xmlRecordFull);
                xmlRecords = xmlRecords + xmlRecordFull;
            });
            //end jsonObj.forEach((newRecord)
            xmlDoc = xmlDecl + xmlRootBegin + xmlRecordsBegin + xmlRecords + xmlRecordsEnd + xmlRootEnd;
            return xmlDoc;
        }
    

    【讨论】:

    • 有趣的解决方案,但 XML 不仅仅是一个字符串。如果您的变量之一包含特殊的 XML 字符(如 、&,"),您的代码将正常工作,但它会中断(创建无效的 XML)。您可能会考虑 xmlbuilder 节点包,它不会有这个漏洞。此外,您不必将元素值包装在 CDATA 中。CDATA 很少使用,通常是在您想要将整个文档嵌入到元素中的情况下。
    • 感谢您的建议!我将检查 xmlbuilder。是的,我知道它很脆弱——没有错误或数据检查。我需要一些快速的东西来从当前的 json 数据中准确地重新创建一个旧的 XML 数据文件。到目前为止,它运行良好,作为概念验证,但我不会将它放入任务关键型应用程序中。再次感谢您的反馈。
    • 是的,有时你会做你必须做的事。祝你的项目好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多