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) })