使用 xml2js 节点 js 将 xml 解析为 json 时未定义的结果
Undefined result when parse xml to json with xml2js node js
我在使用 xml2js 将 XML 解析为 JSON 时遇到问题。这是我的 xml.
<Tables>
<Table>
<Id>TABLE1</Id>
<Description>Test 1</Description>
<FullName>TEST.CHEM.Customer</FullName>
<Columns>
<Column>
<Id>1</Id>
<Name>CustomerId</Name>
<DataType>Number</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>CustomerName</Name>
<DataType>String</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>ValidFrom</Name>
<DataType>Date</DataType>
</Column>
</Columns>
</Table></Tables>
这是我的主要内容。我遵循该库中的片段 figuredOutXML (input: xmlfile.parseString, output: data)
apiRoutes.get('/test', function(req, res) {
res.set('Content-Type', 'application/json');
figuredOutXML(function(err,data,data2){
if(err){
console.log("Error!");
console.error(err.message);
}else{
var tableId = util.inspect(data2.Tables.Table.Id, false, null);
res.status(200).send(JSON.stringify({
INFO: 'SUCCESS',
TABLE: tableId}));
}
});
但是 tableId
我得到了未定义的结果。是xml还是函数有问题?
这是粗心,它总是未定义的结果,因为 var tableId
是字符串格式,而不是 JSON 格式,请参见 here,所以当 xml 已经被 [= 解析时17=]2js 解析器它已经 json 格式化了。您可以根据上述 xml 文件通过 result.Databases.Tables[0].Table[0].FullName
访问它。
您可以尝试使用另一个软件包 camaro,简单轻松地更改所需的结果。
示例:
const xml = '<Tables>
<Table>
<Id>TABLE1</Id>
<Description>Test 1</Description>
<FullName>TEST.CHEM.Customer</FullName>
<Columns>
<Column>
<Id>1</Id>
<Name>CustomerId</Name>
<DataType>Number</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>CustomerName</Name>
<DataType>String</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>ValidFrom</Name>
<DataType>Date</DataType>
</Column>
</Columns>
</Table></Tables>'
const temp = {
table_id: 'Tables/Table/Id'
columns: ['/Tables/Table/Columns/Column', {
column_id: 'Id',
name: 'Name'
}]
}
const transform = require('camaro')
const results = transform(xml, temp)
console.log(JSON.stringify(results, null, 2))
结果
{
"columns": [
{
"column_id": "1",
"name": "CustomerId"
},
{
"column_id": "2",
"name": "CustomerName"
},
{
"column_id": "2",
"name": "ValidFrom"
}
],
"table_id": "TABLE1"
}
我在使用 xml2js 将 XML 解析为 JSON 时遇到问题。这是我的 xml.
<Tables>
<Table>
<Id>TABLE1</Id>
<Description>Test 1</Description>
<FullName>TEST.CHEM.Customer</FullName>
<Columns>
<Column>
<Id>1</Id>
<Name>CustomerId</Name>
<DataType>Number</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>CustomerName</Name>
<DataType>String</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>ValidFrom</Name>
<DataType>Date</DataType>
</Column>
</Columns>
</Table></Tables>
这是我的主要内容。我遵循该库中的片段 figuredOutXML (input: xmlfile.parseString, output: data)
apiRoutes.get('/test', function(req, res) {
res.set('Content-Type', 'application/json');
figuredOutXML(function(err,data,data2){
if(err){
console.log("Error!");
console.error(err.message);
}else{
var tableId = util.inspect(data2.Tables.Table.Id, false, null);
res.status(200).send(JSON.stringify({
INFO: 'SUCCESS',
TABLE: tableId}));
}
});
但是 tableId
我得到了未定义的结果。是xml还是函数有问题?
这是粗心,它总是未定义的结果,因为 var tableId
是字符串格式,而不是 JSON 格式,请参见 here,所以当 xml 已经被 [= 解析时17=]2js 解析器它已经 json 格式化了。您可以根据上述 xml 文件通过 result.Databases.Tables[0].Table[0].FullName
访问它。
您可以尝试使用另一个软件包 camaro,简单轻松地更改所需的结果。
示例:
const xml = '<Tables>
<Table>
<Id>TABLE1</Id>
<Description>Test 1</Description>
<FullName>TEST.CHEM.Customer</FullName>
<Columns>
<Column>
<Id>1</Id>
<Name>CustomerId</Name>
<DataType>Number</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>CustomerName</Name>
<DataType>String</DataType>
</Column>
<Column>
<Id>2</Id>
<Name>ValidFrom</Name>
<DataType>Date</DataType>
</Column>
</Columns>
</Table></Tables>'
const temp = {
table_id: 'Tables/Table/Id'
columns: ['/Tables/Table/Columns/Column', {
column_id: 'Id',
name: 'Name'
}]
}
const transform = require('camaro')
const results = transform(xml, temp)
console.log(JSON.stringify(results, null, 2))
结果
{
"columns": [
{
"column_id": "1",
"name": "CustomerId"
},
{
"column_id": "2",
"name": "CustomerName"
},
{
"column_id": "2",
"name": "ValidFrom"
}
],
"table_id": "TABLE1"
}