diff --git a/acceptance_tests/output-format.sh b/acceptance_tests/output-format.sh index 1ba77ffe..995f0fcf 100755 --- a/acceptance_tests/output-format.sh +++ b/acceptance_tests/output-format.sh @@ -142,16 +142,17 @@ EOM assertEquals "$expected" "$X" } -testOutputXmlMultiPropertiesMultietc() { +testOutputXmComplex() { cat >test.yml < - + cat - asd + dog + EOM diff --git a/pkg/yqlib/doc/usage/headers/xml.md b/pkg/yqlib/doc/usage/headers/xml.md index b182a97b..1bf3d01a 100644 --- a/pkg/yqlib/doc/usage/headers/xml.md +++ b/pkg/yqlib/doc/usage/headers/xml.md @@ -2,8 +2,6 @@ Encode and decode to and from XML. Whitespace is not conserved for round trips - but the order of the fields are. -As yaml does not have the concept of attributes, xml attributes are converted to regular fields with a prefix to prevent clobbering. This defaults to "+", use the `--xml-attribute-prefix` to change. - Consecutive xml nodes with the same name are assumed to be arrays. All values in XML are assumed to be strings - but you can use `from_yaml` to parse them into their correct types: @@ -14,8 +12,6 @@ yq e -p=xml '.myNumberField |= from_yaml' my.xml ``` -XML nodes that have attributes then plain content, e.g: - ```xml meow ``` diff --git a/pkg/yqlib/doc/usage/xml.md b/pkg/yqlib/doc/usage/xml.md index 5b08ad9a..c18a039e 100644 --- a/pkg/yqlib/doc/usage/xml.md +++ b/pkg/yqlib/doc/usage/xml.md @@ -2,8 +2,6 @@ Encode and decode to and from XML. Whitespace is not conserved for round trips - but the order of the fields are. -As yaml does not have the concept of attributes, xml attributes are converted to regular fields with a prefix to prevent clobbering. This defaults to "+", use the `--xml-attribute-prefix` to change. - Consecutive xml nodes with the same name are assumed to be arrays. All values in XML are assumed to be strings - but you can use `from_yaml` to parse them into their correct types: @@ -14,8 +12,6 @@ yq e -p=xml '.myNumberField |= from_yaml' my.xml ``` -XML nodes that have attributes then plain content, e.g: - ```xml meow ``` @@ -58,7 +54,7 @@ animal: ``` ## Parse xml: attributes -Attributes are converted to fields, with the attribute prefix. +Attributes are converted to fields, with the default attribute prefix '+'. Use '--xml-attribute-prefix` to set your own. Given a sample.xml file of: ```xml @@ -79,7 +75,7 @@ cat: ``` ## Parse xml: attributes with content -Content is added as a field, using the content name +Content is added as a field, using the default content name of '+content'. Use `--xml-content-name` to set your own. Given a sample.xml file of: ```xml @@ -271,24 +267,18 @@ for x --> ``` then ```bash -yq e -p=xml '.' sample.xml +yq e -p=xml -o=xml '.' sample.xml ``` will output -```yaml -# before cat -cat: - # in cat before - x: "3" # multi - # line comment - # for x - # before y - - y: - # in y before - # in d before - d: z # in d after - # in y after - # in_cat_after -# after cat +```xml + + 3 + + z + + ``` diff --git a/pkg/yqlib/xml_test.go b/pkg/yqlib/xml_test.go index e375c49d..2d39c5c3 100644 --- a/pkg/yqlib/xml_test.go +++ b/pkg/yqlib/xml_test.go @@ -217,13 +217,13 @@ var xmlScenarios = []xmlScenario{ }, { description: "Parse xml: attributes", - subdescription: "Attributes are converted to fields, with the attribute prefix.", + subdescription: "Attributes are converted to fields, with the default attribute prefix '+'. Use '--xml-attribute-prefix` to set your own.", input: "\n\n 7\n", expected: "D0, P[], (doc)::cat:\n +legs: \"4\"\n legs: \"7\"\n", }, { description: "Parse xml: attributes with content", - subdescription: "Content is added as a field, using the content name", + subdescription: "Content is added as a field, using the default content name of '+content'. Use `--xml-content-name` to set your own.", input: "\nmeow", expected: "D0, P[], (doc)::cat:\n +content: meow\n +legs: \"4\"\n", }, @@ -313,6 +313,8 @@ func documentXmlScenario(t *testing.T, w *bufio.Writer, i interface{}) { } if s.scenarioType == "encode" { documentXmlEncodeScenario(w, s) + } else if s.scenarioType == "roundtrip" { + documentXmlRoundTripScenario(w, s) } else { documentXmlDecodeScenario(t, w, s) } @@ -366,6 +368,24 @@ func documentXmlEncodeScenario(w *bufio.Writer, s xmlScenario) { writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", processScenario(s))) } +func documentXmlRoundTripScenario(w *bufio.Writer, s xmlScenario) { + writeOrPanic(w, fmt.Sprintf("## %v\n", s.description)) + + if s.subdescription != "" { + writeOrPanic(w, s.subdescription) + writeOrPanic(w, "\n\n") + } + + writeOrPanic(w, "Given a sample.xml file of:\n") + writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.input)) + + writeOrPanic(w, "then\n") + writeOrPanic(w, "```bash\nyq e -p=xml -o=xml '.' sample.xml\n```\n") + writeOrPanic(w, "will output\n") + + writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", processScenario(s))) +} + func TestXmlScenarios(t *testing.T) { for _, tt := range xmlScenarios { testXmlScenario(t, tt)