diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index c902f1295aa..c14954df155 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -768,6 +768,12 @@ func (d *Decoder) rawToken() (Token, error) { } b0, b1 = b1, b } + + // Replace the comment with a space in the returned Directive + // body, so that markup parts that were separated by the comment + // (like a "<" and a "!") don't get joined when re-encoding the + // Directive, taking new semantic meaning. + d.buf.WriteByte(' ') } } return Directive(d.buf.Bytes()), nil diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go index 47d0c391670..19152dbdb68 100644 --- a/src/encoding/xml/xml_test.go +++ b/src/encoding/xml/xml_test.go @@ -802,11 +802,11 @@ var directivesWithCommentsInput = ` var directivesWithCommentsTokens = []Token{ CharData("\n"), - Directive(`DOCTYPE []`), + Directive(`DOCTYPE [ ]`), CharData("\n"), - Directive(`DOCTYPE []`), + Directive(`DOCTYPE [ ]`), CharData("\n"), - Directive(`DOCTYPE []`), + Directive(`DOCTYPE [ ]`), CharData("\n"), } @@ -1051,9 +1051,10 @@ func testRoundTrip(t *testing.T, input string) { func TestRoundTrip(t *testing.T) { tests := map[string]string{ - "leading colon": `<::Test ::foo="bar"><:::Hello>`, - "trailing colon": ``, - "double colon": ``, + "leading colon": `<::Test ::foo="bar"><:::Hello>`, + "trailing colon": ``, + "double colon": ``, + "comments in directives": `--x --> > --x ]>`, } for name, input := range tests { t.Run(name, func(t *testing.T) { testRoundTrip(t, input) })