使用XML-js或xml2js将XML字符串转换为JSON时丢失数据字段



我正在尝试将xml字符串转换为json。到目前为止,所有数据都已成功加载,但后来我发现,有时在读取数据时,点并不存在。

使用这个xmlString:

<!DOCTYPE Metadata SYSTEM "/data/someConfig/path"><Metadata>
<Standard>
<Priority>Medium</Priority>
<DueDate/>
<Comment/>
<Size/>
</Standard>
<PublicationsInformation/>
<Details>
<CommissionedCount/>
</Details>
<EventDetails>
<EventContacts>
<EventContact>
<PersonName/>
<PersonEmail/>
<PersonPhone/>
</EventContact>
</EventContacts>
<Journalist>
<PersonName>Journalist name here</PersonName>
</Journalist>
</EventDetails>
<Location>
<SubLocation>Sydney NSW, Australia</SubLocation>
<Suburb>Sydney</Suburb>
<State>NSW</State>
<Country>AU</Country>
<Latitude/>
<Longitude/>
<AdditionalLocationDetails/>
<Lat>-33.8688197</Lat>
<Lng>151.2092955</Lng>
</Location>
<EventAssignedTo>
<InternalUserEmails/>
<InternalUserSMS/>
<InternalUserNames/>
</EventAssignedTo>
<TestPath>
<EventName>An event name</EventName>
</TestPath>
</Metadata>

在此代码中运行:

export const getCurrentMetaData = (ctx: any): object => {
const xmlStr = serializer.serializeToString(xmlMetaData);

console.log('XML string: ') 
console.log(xmlStr)

const options = { compact: true, spaces: 4 };
const json = xml2js(xmlStr, options);

console.log('Converted to json: ')
console.log(json)

return json;
};

我得到这个输出对象:

{
{
"_doctype": "Metadata SYSTEM "/data/someConfig/path"",
"Metadata": {
"Standard": {
"Priority": {
"_text": "Medium"
},
"DueDate": {},
"Comment": {},
"Size": {}
},
"PublicationsInformation": {},
"Details": {
"CommissionedCount": {}
},
"EventDetails": {
"EventContacts": {
"EventContact": [
{
"PersonName": "",
"PersonEmail": "",
"PersonPhone": ""
}
]
}
},
"Location": {
"SubLocation": {
"_text": "Sydney NSW, Australia"
},
"Suburb": {
"_text": "Sydney"
},
"State": {
"_text": "NSW"
},
"Country": {
"_text": "AU"
},
"Latitude": {},
"Longitude": {},
"AdditionalLocationDetails": {},
"Lat": {
"_text": "-33.8688197"
},
"Lng": {
"_text": "151.2092955"
}
},
"EventAssignedTo": {
"InternalUserEmails": {},
"InternalUserSMS": {},
"InternalUserNames": {}
},
"TestPath": {
"EventName": {
"_text": "An event name"
}
}
}
}

如您所见,此处缺少Journalist.PersonName。此外,如果我使用lodash.get(obj,'Metadata.EventDetails.Journalist.PersonName_text'(,我会得到信息,即使我在打印时没有看到实际对象上的数据。这里发生了什么,有人知道如何修复它吗?

我已经用快速xml解析器测试了这一点,它会返回您需要的输出。

const json = '{"Metadata":{"Standard":{"Priority":"Medium","DueDate":"","Comment":"","Size":""},"PublicationsInformation":"","Details":{"CommissionedCount":""},"EventDetails":{"EventContacts":{"EventContact":{"PersonName":"","PersonEmail":"","PersonPhone":""}},"Journalist":{"PersonName":"Journalist name here"}},"Location":{"SubLocation":"Sydney NSW, Australia","Suburb":"Sydney","State":"NSW","Country":"AU","Latitude":"","Longitude":"","AdditionalLocationDetails":"","Lat":-33.8688197,"Lng":151.2092955},"EventAssignedTo":{"<InternalUserEmails":"","InternalUserSMS":"","InternalUserNames":""},"TestPath":{"EventName":"An event name"}}}';
const data = JSON.parse(json);
console.log(data.Metadata.EventDetails.Journalist.PersonName);

我用camaro进行了测试,它也很好。

var { transform } = require("camaro")
const xml = `<!DOCTYPE Metadata SYSTEM "/data/someConfig/path"><Metadata>
<Standard>
<Priority>Medium</Priority>
<DueDate/>
<Comment/>
<Size/>
</Standard>
<PublicationsInformation/>
<Details>
<CommissionedCount/>
</Details>
<EventDetails>
<EventContacts>
<EventContact>
<PersonName/>
<PersonEmail/>
<PersonPhone/>
</EventContact>
</EventContacts>
<Journalist>
<PersonName>Journalist name here</PersonName>
</Journalist>
</EventDetails>
<Location>
<SubLocation>Sydney NSW, Australia</SubLocation>
<Suburb>Sydney</Suburb>
<State>NSW</State>
<Country>AU</Country>
<Latitude/>
<Longitude/>
<AdditionalLocationDetails/>
<Lat>-33.8688197</Lat>
<Lng>151.2092955</Lng>
</Location>
<EventAssignedTo>
<InternalUserEmails/>
<InternalUserSMS/>
<InternalUserNames/>
</EventAssignedTo>
<TestPath>
<EventName>An event name</EventName>
</TestPath>
</Metadata>
`
const template = {
personName: '/Metadata/EventDetails/Journalist/PersonName',
testPathEventName: '/Metadata/TestPath/EventName'
}
console.log(await transform(xml, template))

输出

Object {personName: "Journalist name here", testPathEventName: "An event name"}

最新更新