diff --git a/lib/sax.js b/lib/sax.js index f8b494e09..c46d1467a 100644 --- a/lib/sax.js +++ b/lib/sax.js @@ -531,8 +531,16 @@ function parseDCC(source,start,domBuilder,errorHandler){//sure start with '1 && /!doctype/i.test(matchs[0][0])){ var name = matchs[1][0]; - var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0] - var sysid = len>4 && matchs[4][0]; + var pubid = false; + var sysid = false; + if(len>3){ + if(/^public$/i.test(matchs[2][0])){ + pubid = matchs[3][0]; + sysid = len>4 && matchs[4][0]; + }else if(/^system$/i.test(matchs[2][0])){ + sysid = matchs[3][0]; + } + } var lastMatch = matchs[len-1] domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'), sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2')); diff --git a/test/parse/node.test.js b/test/parse/node.test.js index 4f3ed9cb2..9d7ff5796 100644 --- a/test/parse/node.test.js +++ b/test/parse/node.test.js @@ -195,4 +195,14 @@ describe('XML Node Parse', () => { `${DOCTYPE}` ) }) + + it('preserves doctype with sysid', () => { + const DOCTYPE = '' + + const actual = new DOMParser() + .parseFromString(`${DOCTYPE}`, 'text/xml') + .toString() + + expect(actual).toStrictEqual(`${DOCTYPE}`) + }) }) diff --git a/test/xmltest/__snapshots__/not-wf.test.js.snap b/test/xmltest/__snapshots__/not-wf.test.js.snap index 8b8c48de5..5661d2d99 100644 --- a/test/xmltest/__snapshots__/not-wf.test.js.snap +++ b/test/xmltest/__snapshots__/not-wf.test.js.snap @@ -442,7 +442,7 @@ Object { exports[`xmltest/not-wellformed standalone should match 056.xml with snapshot 1`] = ` Object { - "actual": " + "actual": " ", } `; @@ -1387,7 +1387,7 @@ Object { exports[`xmltest/not-wellformed standalone should match 185.xml with snapshot 1`] = ` Object { "actual": " -\\"> + &e;", "error": Array [ "[xmldom error] entity not found:&e;