javascript - 如何将 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 方法中进行哪些更改以实现预期结果吗?
解决方案
根据您的要求,我对您的方法进行了一项更改
看看下面的方法,让我知道它有用与否?
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;
}
谢谢
推荐阅读
- heroku - 如何将heroku计划升级到爱好?
- c# - BizTalk WCF LOB 适配器:我可以自定义方案名称吗
- vue.js - 如何在 vuex store 中使用 axios 实例属性?
- javascript - ctx.drawImage - 结果为黑色矩形
- html - 无法在移动设备上看到完整的弹出窗口
- amazon-web-services - AWS Auto Scaling 数据库
- vert.x - `org.bson.codecs.configuration.CodecConfigurationException` 从 vertx 写入 MongoDB
- python - 如何使用美丽的汤保存页面中的所有图像?
- php - 计算数组中特定数字的值并返回出现次数
- java - switch语句上的“需要常量表达式”?