From 9c6d84d18415d5a53738a5fc78354dd844018e30 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Wed, 22 Dec 2021 11:58:52 +1100 Subject: [PATCH] wip xml encoding --- pkg/yqlib/decoder_xml.go | 2 - pkg/yqlib/doc/usage/xml.md | 180 +------------------------------------ pkg/yqlib/xml_test.go | 155 +++++++++++++++++--------------- 3 files changed, 85 insertions(+), 252 deletions(-) diff --git a/pkg/yqlib/decoder_xml.go b/pkg/yqlib/decoder_xml.go index 39e2b3ac..3c0e5451 100644 --- a/pkg/yqlib/decoder_xml.go +++ b/pkg/yqlib/decoder_xml.go @@ -74,7 +74,6 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) { label := keyValuePair.K children := keyValuePair.V labelNode := createScalarNode(label, label) - // labelNode.HeadComment = n.HeadComment var valueNode *yaml.Node var err error log.Debug("len of children in %v is %v", label, len(children)) @@ -89,7 +88,6 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) { if err != nil { return nil, err } - if i == len(n.Children)-1 { valueNode.FootComment = n.FootComment } diff --git a/pkg/yqlib/doc/usage/xml.md b/pkg/yqlib/doc/usage/xml.md index 79f7c902..408b28d7 100644 --- a/pkg/yqlib/doc/usage/xml.md +++ b/pkg/yqlib/doc/usage/xml.md @@ -22,83 +22,8 @@ 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. -## Parse xml: simple -Given a sample.xml file of: -```xml - -meow -``` -then -```bash -yq e -p=xml '.' sample.xml -``` -will output -```yaml -cat: meow -``` - -## Parse xml: array -Consecutive nodes with identical xml names are assumed to be arrays. - -Given a sample.xml file of: -```xml - -1 -2 -``` -then -```bash -yq e -p=xml '.' sample.xml -``` -will output -```yaml -animal: - - "1" - - "2" -``` - -## Parse xml: attributes -Attributes are converted to fields, with the attribute prefix. - -Given a sample.xml file of: -```xml - - - 7 - -``` -then -```bash -yq e -p=xml '.' sample.xml -``` -will output -```yaml -cat: - +legs: "4" - legs: "7" -``` - -## Parse xml: attributes with content -Content is added as a field, using the content name - -Given a sample.xml file of: -```xml - -meow -``` -then -```bash -yq e -p=xml '.' sample.xml -``` -will output -```yaml -cat: - +content: meow - +legs: "4" -``` - -## Parse xml: with comments -A best attempt is made to preserve comments. +## 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 @@ -139,104 +64,3 @@ cat: # after cat ``` -## Encode xml: simple -Given a sample.yml file of: -```yaml -cat: purrs -``` -then -```bash -yq e -o=xml '.' sample.yml -``` -will output -```xml -purrs -``` - -## Encode xml: array -Given a sample.yml file of: -```yaml -pets: - cat: - - purrs - - meows -``` -then -```bash -yq e -o=xml '.' sample.yml -``` -will output -```xml - - purrs - meows - -``` - -## Encode xml: attributes -Fields with the matching xml-attribute-prefix are assumed to be attributes. - -Given a sample.yml file of: -```yaml -cat: - +name: tiger - meows: true - -``` -then -```bash -yq e -o=xml '.' sample.yml -``` -will output -```xml - - true - -``` - -## Encode xml: attributes with content -Fields with the matching xml-content-name is assumed to be content. - -Given a sample.yml file of: -```yaml -cat: - +name: tiger - +content: cool - -``` -then -```bash -yq e -o=xml '.' sample.yml -``` -will output -```xml -cool -``` - -## Encode xml: comments -A best attempt is made to copy comments to xml. - -Given a sample.yml file of: -```yaml -# above_cat -cat: # inline_cat - # above_array - array: # inline_array - - val1 # inline_val1 - # above_val2 - - val2 # inline_val2 -# below_cat - -``` -then -```bash -yq e -o=xml '.' sample.yml -``` -will output -```xml - - val1 - val2 - -``` - diff --git a/pkg/yqlib/xml_test.go b/pkg/yqlib/xml_test.go index 6550da80..91b4ca2b 100644 --- a/pkg/yqlib/xml_test.go +++ b/pkg/yqlib/xml_test.go @@ -89,6 +89,16 @@ cat: # after cat ` +var expectedRoundtripXmlWithComments = ` + 3 + + 4 + + +` + var yamlWithComments = `# above_cat cat: # inline_cat # above_array @@ -106,81 +116,82 @@ var expectedXmlWithComments = `value", - // expected: "value", - // scenarioType: "roundtrip", + // input: "cat:\n ++name: tiger\n meows: true\n", + // expected: "\n true\n\n", + // scenarioType: "encode", // }, + // { + // description: "Encode xml: attributes with content", + // subdescription: "Fields with the matching xml-content-name is assumed to be content.", + // input: "cat:\n +name: tiger\n +content: cool\n", + // expected: "cool\n", + // scenarioType: "encode", + // }, + // { + // description: "Encode xml: comments", + // subdescription: "A best attempt is made to copy comments to xml.", + // input: yamlWithComments, + // 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", + }, } func testXmlScenario(t *testing.T, s xmlScenario) {