diff --git a/pkg/yqlib/decoder_xml.go b/pkg/yqlib/decoder_xml.go index a58b3254..a6da9a71 100644 --- a/pkg/yqlib/decoder_xml.go +++ b/pkg/yqlib/decoder_xml.go @@ -91,6 +91,10 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) { if i == 0 { labelNode.HeadComment = dec.processComment(n.HeadComment) + + } + + if i == len(n.Children)-1 { labelNode.FootComment = dec.processComment(n.FootComment) } diff --git a/pkg/yqlib/doc/usage/xml.md b/pkg/yqlib/doc/usage/xml.md index eee366c4..64535f3f 100644 --- a/pkg/yqlib/doc/usage/xml.md +++ b/pkg/yqlib/doc/usage/xml.md @@ -22,3 +22,48 @@ XML nodes that have attributes then plain content, e.g: The content of the node will be set as a field in the map with the key "+content". Use the `--xml-content-name` flag to change this. +## Round trip: with comments +A best effort is made, but comment positions and white space are not preserved perfectly. + +Given a sample.xml file of: +```xml + + + + + 3 + + + + z + + + + + + + +``` +then +```bash +yq e -p=xml '.' sample.xml +``` +will output +```yaml +# before cat +cat: + # in cat before + x: "3" # multi + # line comment + # for x + y: + # in y before + # in d before + d: z # in d after + # in y after + # before y in_cat_after +# after cat +``` + diff --git a/pkg/yqlib/xml_test.go b/pkg/yqlib/xml_test.go index 15b32255..d8b944cb 100644 --- a/pkg/yqlib/xml_test.go +++ b/pkg/yqlib/xml_test.go @@ -254,13 +254,13 @@ var xmlScenarios = []xmlScenario{ // expected: expectedXmlWithComments, // scenarioType: "encode", // }, - // { - // description: "Round trip: with comments", - // subdescription: "A best effort is made, but comment positions and white space are not preserved perfectly.", - // input: inputXmlWithComments, - // expected: expectedRoundtripXmlWithComments, - // scenarioType: "roundtrip", - // }, + { + description: "Round trip: with comments", + subdescription: "A best effort is made, but comment positions and white space are not preserved perfectly.", + input: inputXmlWithComments, + expected: expectedRoundtripXmlWithComments, + scenarioType: "roundtrip", + }, } func testXmlScenario(t *testing.T, s xmlScenario) {