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;