为什么我不能解析XML?

时间:2020-10-15 03:50:37

标签: javascript html xml

将结果消息解析为XML时出现错误。 有人知道为什么吗?

谢谢。

let program =  [{"getUnixCommandResult:1":"Content-type: text/html","getUnixCommandResult:2":"","getUnixCommandResult:3":"IARM_Init group name = com.comcast.rdk.iarm.bus member name = DisplaySettingsService","getUnixCommandResult:4":"setting init done\r","getUnixCommandResult:5":"Registering DisplaySettingsService\r","getUnixCommandResult:6":"<<<<< VDISP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:7":"<<<<< AOP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:8":"<<<<< VOP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:9":"<<<<< VID is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:10":"dsGetVideoPort..6--1225541724","getUnixCommandResult:11":"dsGetVideoPort..5--1225541756","getUnixCommandResult:12":"[getSingleRecord:6644]-------------------------------10","getUnixCommandResult:13":"resultMessage = [{\"value\": [{\"status\": \"0\", \"nRecording\": \"0\", \"nPreBooks\": \"1\", \"nTotal\": \"1\", \"PreScheduleData\": \"<?xml version=\\\"1.0\\\"?>\\n<root>\\n  <Schedule BookId=\\\"10\\\" workingid=\\\"0\\\" channelNumber=\\\"011\\\" channelName=\\\"&#xFF2E;&#xFF28;&#xFF2B;&#x7DCF;&#x5408;&#xFF11;&#x30FB;&#x6771;&#x4EAC;\\\" startTime=\\\"1547617620000\\\" endTime=\\\"1547618400000\\\" onid=\\\"32736\\\" srvid=\\\"1024\\\" title=\\\"&#x30C6;&#x30EC;&#x30D3;&#x4F53;&#x64CD;&#x1F211;\\\" tsid=\\\"32736\\\" event_id=\\\"9552\\\" recCtrlData=\\\"2\\\" rating=\\\"0\\\" audioType=\\\"3\\\" nibLvl1=\\\"1A2\\\" nibLvl2=\\\"FF3\\\" description=\\\"&#x3010;&#x51FA;&#x6F14;&#x3011;&#x9234;&#x6728;&#x5927;&#x8F14;&#xFF0C;&#x6E05;&#x6C34;&#x6C99;&#x5E0C;&#xFF0C;&#x5409;&#x6C5F;&#x6674;&#x83DC;&#xFF0C;&#x8218;&#x91CE;&#x4F36;&#x5948;&#xFF0C;&#x3010;&#x30D4;&#x30A2;&#x30CE;&#x3011;&#x52A0;&#x85E4;&#x7531;&#x7F8E;&#x5B50;\\\" recMode=\\\"0\\\" record_status=\\\"2\\\" storage_type=\\\"1\\\" book_type=\\\"2\\\"/>\\n  <Counts Recording=\\\"0\\\" PreBooks=\\\"1\\\" Total=\\\"1\\\"/>\\n</root>\\n\"}]}]","getUnixCommandResult:14":"term start init 1\r"}]

console.log(program[0]["getUnixCommandResult:13"])
let resultMessage =program[0]["getUnixCommandResult:13"]

let indexOfSchedule = resultMessage.indexOf('PreScheduleData')
console.log(indexOfSchedule)

resultMessage = resultMessage.slice(indexOfSchedule + 19)
console.log(resultMessage)
let endIndexOfSchedule = resultMessage.indexOf('Counts')

resultMessage = resultMessage.slice(0,resultMessage.length - 5)
console.log(resultMessage)

let parser = new DOMParser();
let doc = parser.parseFromString(resultMessage, "text/xml");

console.log(doc)
.as-console-wrapper { max-height: 100% !important; }

1 个答案:

答案 0 :(得分:1)

由于在输入中所有"字符已被\"替换,以便能够将其存储在其他字符串中,这将导致XML中的属性不正确。

如果输入无法固定,一种快速解决方案是解析由两个"包裹的结果字符串。

let program =  [{"getUnixCommandResult:1":"Content-type: text/html","getUnixCommandResult:2":"","getUnixCommandResult:3":"IARM_Init group name = com.comcast.rdk.iarm.bus member name = DisplaySettingsService","getUnixCommandResult:4":"setting init done\r","getUnixCommandResult:5":"Registering DisplaySettingsService\r","getUnixCommandResult:6":"<<<<< VDISP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:7":"<<<<< AOP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:8":"<<<<< VOP is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:9":"<<<<< VID is initialized in Multi-App Mode >>>>>>>>\r","getUnixCommandResult:10":"dsGetVideoPort..6--1225541724","getUnixCommandResult:11":"dsGetVideoPort..5--1225541756","getUnixCommandResult:12":"[getSingleRecord:6644]-------------------------------10","getUnixCommandResult:13":"resultMessage = [{\"value\": [{\"status\": \"0\", \"nRecording\": \"0\", \"nPreBooks\": \"1\", \"nTotal\": \"1\", \"PreScheduleData\": \"<?xml version=\\\"1.0\\\"?>\\n<root>\\n  <Schedule BookId=\\\"10\\\" workingid=\\\"0\\\" channelNumber=\\\"011\\\" channelName=\\\"&#xFF2E;&#xFF28;&#xFF2B;&#x7DCF;&#x5408;&#xFF11;&#x30FB;&#x6771;&#x4EAC;\\\" startTime=\\\"1547617620000\\\" endTime=\\\"1547618400000\\\" onid=\\\"32736\\\" srvid=\\\"1024\\\" title=\\\"&#x30C6;&#x30EC;&#x30D3;&#x4F53;&#x64CD;&#x1F211;\\\" tsid=\\\"32736\\\" event_id=\\\"9552\\\" recCtrlData=\\\"2\\\" rating=\\\"0\\\" audioType=\\\"3\\\" nibLvl1=\\\"1A2\\\" nibLvl2=\\\"FF3\\\" description=\\\"&#x3010;&#x51FA;&#x6F14;&#x3011;&#x9234;&#x6728;&#x5927;&#x8F14;&#xFF0C;&#x6E05;&#x6C34;&#x6C99;&#x5E0C;&#xFF0C;&#x5409;&#x6C5F;&#x6674;&#x83DC;&#xFF0C;&#x8218;&#x91CE;&#x4F36;&#x5948;&#xFF0C;&#x3010;&#x30D4;&#x30A2;&#x30CE;&#x3011;&#x52A0;&#x85E4;&#x7531;&#x7F8E;&#x5B50;\\\" recMode=\\\"0\\\" record_status=\\\"2\\\" storage_type=\\\"1\\\" book_type=\\\"2\\\"/>\\n  <Counts Recording=\\\"0\\\" PreBooks=\\\"1\\\" Total=\\\"1\\\"/>\\n</root>\\n\"}]}]","getUnixCommandResult:14":"term start init 1\r"}]

let resultMessage = program[0]["getUnixCommandResult:13"];

let indexOfSchedule = resultMessage.indexOf('PreScheduleData')


resultMessage = resultMessage.slice(indexOfSchedule + 19)

let endIndexOfSchedule = resultMessage.indexOf('Counts')

resultMessage = resultMessage.slice(0,resultMessage.length - 5);
resultMessage = JSON.parse('"'+ resultMessage + '"');
console.log(resultMessage)

let parser = new DOMParser();
let doc = parser.parseFromString(resultMessage, "text/xml");
console.log( "first element channelName:",
  doc.documentElement.firstElementChild.getAttribute("channelName")
);
.as-console-wrapper { max-height: 100% !important; }