From e2710c3983b3249ba30f2d21802c984aef5fb163 Mon Sep 17 00:00:00 2001 From: jingrui Date: Wed, 23 Dec 2020 16:03:15 +0800 Subject: [PATCH 2/2] encoding/xml: replace comments inside directives with a space A Directive (like ) can't have other nodes nested inside it (in our data structure representation), so there is no way to preserve comments. The previous behavior was to just elide them, which however might change the semantic meaning of the surrounding markup. Instead, replace them with a space which hopefully has the same semantic effect of the comment. Directives are not actually a node type in the XML spec, which instead specifies each of them separately ( --- src/encoding/xml/xml.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index 073ceee1b2..3746018613 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -764,6 +764,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 -- 2.17.1