首页 > 解决方案 > 如何将 JavaScript 对象转换为 XML

问题描述

我在将 JavaScript 对象转换为 XML 时遇到问题。我有一个 JavaScript 对象,里面有一个数组,下面添加了详细信息:

var jsonTestData =
              {
                "ID": 1,
                "ApplicationName": "ABC",
                "Methods": [
                  {
                    "ID": 1,
                    "Name": "AAA",
                    "Description": "Test Method",
                    "Parameters": [
                      {
                        "ID": 3,
                        "Name": "B",
                        "DefaultValue": "IE"
                      }
                    ]
                  },
                  {
                    "ID": 2,
                    "Name": "BBB",
                    "Description": "s",
                    "Parameters": [
                      {
                        "ID": 4,
                        "Name": "B",
                        "DefaultValue": "f"
                      },
                      {
                        "ID": 5,
                        "Name": "P",
                        "DefaultValue": "E]]>"
                      }
                    ]
                  },
                  {
                    "ID": 3,
                    "Name": "Valid",
                    "Description": "Some description",
                    "Parameters": [
                      {
                        "ID": 6,
                        "Name": "ExpectedResult",
                        "DefaultValue": "0\"]]]>"
                      }
                    ]
                  },
                  {
                    "ID": 4,
                    "Name": "Message",
                    "Description": "Some description",
                    "Parameters": [
                      {
                        "ID": 7,
                        "Name": "Message",
                        "DefaultValue": "* First thing* Second thing Sub thing * Third thing"
                      }
                    ]
                  },
                  {
                    "ID": 5,
                    "Name": "Result",
                    "Description": "Some description",
                    "Parameters": null
                  },
                  {
                    "ID": 6,
                    "Name": "Verify",
                    "Description": "Some description",
                    "Parameters": [
                      {
                        "ID": 8,
                        "Name": "FileToCheck",
                        "DefaultValue": "1"
                      }
                    ]
                  }
                ]
              }

我需要将给定的 JavaScript 对象转换为 XML,并且也能够将其转换为 XML。将上面的 JavaScript Object 转换为 XML 的 JavaScript 方法如下所示,

OBJtoXML = (obj: { [x: string]: any; }) => {
                var xml = '';
                for (var prop in obj) {
                  if (prop === "Name") {
            
                  } else {
                    xml += obj[prop] instanceof Array ? '' : "<" + prop + ">";
                  }
                  if (obj[prop] instanceof Array) {
                    for (var array in obj[prop]) {
                      xml += "<" + prop + ">";
                      xml += this.OBJtoXML(new Object(obj[prop][array])); //add values
                      xml += "</" + prop + ">";
                    }
                  } else if (typeof obj[prop] == "object") {
                    xml += this.OBJtoXML(new Object(obj[prop]));
                  } else {
                    xml += obj[prop];
                  }
            
                  if (prop === "Name") {
                    //do nothing
                  }else if (prop === "Parameters") {
                    xml += obj[prop] instanceof Array ? '' : "</Parameters>";
                    xml += "</Name>";
                  }
                  else {
                    xml += obj[prop] instanceof Array ? '' : "</" + prop + ">";
                  }
                }
                var xml = xml.replace(/<\/?[0-9]{1,}>/g, '');
                return xml
              }
    

请注意,我有另一种方法可以从 JavaScript 对象中删除您不需要在 XML 中的键。所以转换后的 XML 如下所示,

<?xml version="1.0" ?>
      <Methods>
        <Name>
            AAA
        </Name>
        <Description>
            Test Method
        </Description>
        <Parameters>
            <Name>
                B
            </Name>
            <DefaultValue>
                IE
            </DefaultValue>
        </Parameters>
    </Methods>
    <Methods>
        <Name>
            BBB
        </Name>
        <Description>
            s
        </Description>
        <Parameters>
            <Name>
                B
            </Name>
            <DefaultValue>
                f
            </DefaultValue>
        </Parameters>
        <Parameters>
            <Name>
                P
            </Name>
            <DefaultValue>
                E]]>
            </DefaultValue>
        </Parameters>
    </Methods>
    <Methods>
        <Name>
            Valid
        </Name>
        <Description>
            Some description
        </Description>
        <Parameters>
            <Name>
                ExpectedResult
            </Name>
            <DefaultValue>
                0"]]]>
            </DefaultValue>
        </Parameters>
    </Methods>
    <Methods>
        <Name>
            Message
        </Name>
        <Description>
            Some description
        </Description>
        <Parameters>
            <Name>
                Message
            </Name>
            <DefaultValue>
                Result
            </DefaultValue>
        </Parameters>
    </Methods>
    <Methods>
        <Name>
            Result
        </Name>
        <Description>
            Some description
        </Description>
        <Parameters>
        </Parameters>
    </Methods>
    <Methods>
        <Name>
            Verify
        </Name>
        <Description>
            Some description
        </Description>
        <Parameters>
            <Name>
                FileToCheck
            </Name>
            <DefaultValue>
                1
            </DefaultValue>
        </Parameters>
    </Methods>

输出看起来不错,但需要在“参数”标签内进行一些修改。在“参数”标签内,我需要将第一个子值显示为第一个标签,并且“默认值”标签值必须是子标签的值。例如:JavaScript 对象

{
    "ID": 6,
    "Name": "Verify",
    "Description": "Some description",
    "Parameters": [
      {
        "ID": 8,
        "Name": "FileToCheck",
        "DefaultValue": "1"
      }
    ]
 }

我的 JavaScript 方法将上面的对象转换为 XML,如下所示,

<Name>
    Verify
</Name>
<Description>
    Some description
</Description>
<Parameters>
    <Name>
        FileToCheck
    </Name>
    <DefaultValue>
        1
    </DefaultValue>
</Parameters>

我想要我的“参数”部分,

<Parameters>     //Name tag value as a tag in the output
    <FileToCheck>
         1       // 'DefaultValue' tag
    </FileToCheck>
</Parameters>

请注意 JavaScript 对象将始终具有“默认值”,我需要将其显示为“参数”标签内的值。那么任何人都可以建议我需要在我的 JavaScript 方法中进行哪些更改以实现预期结果吗?

标签: javascript

解决方案


根据您的要求,我对您的方法进行了一项更改

看看下面的方法,让我知道它有用与否?

OBJtoXML = (obj: { [x: string]: any; }) => {
    var xml = '';
    for (var prop in obj) {
        if (prop === "Name") {

        } else {
            xml += obj[prop] instanceof Array ? '' : "<" + prop + ">";
        }
        if (obj[prop] instanceof Array) {
            for (var array in obj[prop]) {
                xml += "<" + prop + ">";
                if (prop === 'Parameters') {
                    var nObj: any = {};
                    nObj[new Object(obj[prop][array])['Name']] = new Object(obj[prop][array])['DefaultValue'];
                    xml += OBJtoXML(nObj); //add values    
                } else {
                    xml += OBJtoXML(new Object(obj[prop][array])); //add values    
                }
                xml += "</" + prop + ">";
            }
        } else if (typeof obj[prop] == "object") {
            xml += OBJtoXML(new Object(obj[prop]));
        } else {
            xml += obj[prop];
        }

        if (prop === "Name") {
            //do nothing
        } else if (prop === "Parameters") {
            xml += obj[prop] instanceof Array ? '' : "</Parameters>";
            xml += "</Name>";
        }
        else {
            xml += obj[prop] instanceof Array ? '' : "</" + prop + ">";
        }
    }
    var xml = xml.replace(/<\/?[0-9]{1,}>/g, '');
    return xml;
}

我希望它可以帮助我知道...

"use strict";
var jsonTestData = {
    "ID": 1,
    "ApplicationName": "ABC",
    "Methods": [
        {
            "ID": 1,
            "Name": "AAA",
            "Description": "Test Method",
            "Parameters": [
                {
                    "ID": 3,
                    "Name": "B",
                    "DefaultValue": "IE"
                }
            ]
        },
        {
            "ID": 2,
            "Name": "BBB",
            "Description": "s",
            "Parameters": [
                {
                    "ID": 4,
                    "Name": "B",
                    "DefaultValue": "f"
                },
                {
                    "ID": 5,
                    "Name": "P",
                    "DefaultValue": "E]]>"
                }
            ]
        },
        {
            "ID": 3,
            "Name": "Valid",
            "Description": "Some description",
            "Parameters": [
                {
                    "ID": 6,
                    "Name": "ExpectedResult",
                    "DefaultValue": "0\"]]]>"
                }
            ]
        },
        {
            "ID": 4,
            "Name": "Message",
            "Description": "Some description",
            "Parameters": [
                {
                    "ID": 7,
                    "Name": "Message",
                    "DefaultValue": "* First thing* Second thing Sub thing * Third thing"
                }
            ]
        },
        {
            "ID": 5,
            "Name": "Result",
            "Description": "Some description",
            "Parameters": null
        },
        {
            "ID": 6,
            "Name": "Verify",
            "Description": "Some description",
            "Parameters": [
                {
                    "ID": 8,
                    "Name": "FileToCheck",
                    "DefaultValue": "1"
                }
            ]
        }
    ]
};
var d = OBJtoXML(jsonTestData);
console.log(d);
function OBJtoXML(obj) {
    var xml = '';
    for (var prop in obj) {
        if (prop === "Name") {
        }
        else {
            xml += obj[prop] instanceof Array ? '' : "<" + prop + ">";
        }
        if (obj[prop] instanceof Array) {
            for (var array in obj[prop]) {
                xml += "<" + prop + ">";
                if (prop === 'Parameters') {
                    var nObj = {};
                    nObj[new Object(obj[prop][array])['Name']] = new Object(obj[prop][array])['DefaultValue'];
                    xml += OBJtoXML(nObj); //add values    
                }
                else {
                    xml += OBJtoXML(new Object(obj[prop][array])); //add values    
                }
                xml += "</" + prop + ">";
            }
        }
        else if (typeof obj[prop] == "object") {
            xml += OBJtoXML(new Object(obj[prop]));
        }
        else {
            xml += obj[prop];
        }
        if (prop === "Name") {
            //do nothing
        }
        else if (prop === "Parameters") {
            xml += obj[prop] instanceof Array ? '' : "</Parameters>";
            xml += "</Name>";
        }
        else {
            xml += obj[prop] instanceof Array ? '' : "</" + prop + ">";
        }
    }
    var xml = xml.replace(/<\/?[0-9]{1,}>/g, '');
    return xml;
}

谢谢


推荐阅读