From e5564c18fe30af124a52ef642f2e7406d339b018 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Fri, 1 Sep 2023 11:52:58 +1000 Subject: [PATCH] Another xml example --- pkg/yqlib/doc/usage/xml.md | 44 +++++++++++++++++++++++++++----------- pkg/yqlib/xml_test.go | 17 ++++++++++----- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/pkg/yqlib/doc/usage/xml.md b/pkg/yqlib/doc/usage/xml.md index 3d85a4ff..89bee794 100644 --- a/pkg/yqlib/doc/usage/xml.md +++ b/pkg/yqlib/doc/usage/xml.md @@ -53,7 +53,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -78,7 +78,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml ' (.. | select(tag == "!!str")) |= from_yaml' sample.xml +yq -oy ' (.. | select(tag == "!!str")) |= from_yaml' sample.xml ``` will output ```yaml @@ -100,7 +100,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -110,6 +110,24 @@ animal: - goat ``` +## Parse xml: force as an array +In XML, if your array has a single item, then yq doesn't know its an array. This is how you can consistently force it to be an array. This handles the 3 scenarios of having nothing in the array, having a single item and having multiple. + +Given a sample.xml file of: +```xml +cat +``` +then +```bash +yq -oy '.zoo.animal |= ([] + .)' sample.xml +``` +will output +```yaml +zoo: + animal: + - cat +``` + ## Parse xml: attributes Attributes are converted to fields, with the default attribute prefix '+'. Use '--xml-attribute-prefix` to set your own. @@ -122,7 +140,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -142,7 +160,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -161,7 +179,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -190,7 +208,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml -o=xml '.' sample.xml +yq '.' sample.xml ``` will output ```xml @@ -221,7 +239,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml -o=xml --xml-skip-directives '.' sample.xml +yq --xml-skip-directives '.' sample.xml ``` will output ```xml @@ -257,7 +275,7 @@ for x --> ``` then ```bash -yq -p=xml '.' sample.xml +yq -oy '.' sample.xml ``` will output ```yaml @@ -289,7 +307,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml -o=xml --xml-keep-namespace=false '.' sample.xml +yq --xml-keep-namespace=false '.' sample.xml ``` will output ```xml @@ -314,7 +332,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml -o=xml --xml-raw-token=false '.' sample.xml +yq --xml-raw-token=false '.' sample.xml ``` will output ```xml @@ -489,7 +507,7 @@ for x --> ``` then ```bash -yq -p=xml -o=xml '.' sample.xml +yq '.' sample.xml ``` will output ```xml @@ -522,7 +540,7 @@ Given a sample.xml file of: ``` then ```bash -yq -p=xml -o=xml '.' sample.xml +yq '.' sample.xml ``` will output ```xml diff --git a/pkg/yqlib/xml_test.go b/pkg/yqlib/xml_test.go index a86e25ab..e90e3654 100644 --- a/pkg/yqlib/xml_test.go +++ b/pkg/yqlib/xml_test.go @@ -356,6 +356,13 @@ var xmlScenarios = []formatScenario{ input: "\ncat\ngoat", expected: "+p_xml: version=\"1.0\" encoding=\"UTF-8\"\nanimal:\n - cat\n - goat\n", }, + { + description: "Parse xml: force as an array", + subdescription: "In XML, if your array has a single item, then yq doesn't know its an array. This is how you can consistently force it to be an array. This handles the 3 scenarios of having nothing in the array, having a single item and having multiple.", + input: "cat", + expression: ".zoo.animal |= ([] + .)", + expected: "zoo:\n animal:\n - cat\n", + }, { description: "Parse xml: attributes", subdescription: "Attributes are converted to fields, with the default attribute prefix '+'. Use '--xml-attribute-prefix` to set your own.", @@ -687,7 +694,7 @@ func documentXMLDecodeScenario(w *bufio.Writer, s formatScenario) { if expression == "" { expression = "." } - writeOrPanic(w, fmt.Sprintf("```bash\nyq -p=xml '%v' sample.xml\n```\n", expression)) + writeOrPanic(w, fmt.Sprintf("```bash\nyq -oy '%v' sample.xml\n```\n", expression)) writeOrPanic(w, "will output\n") writeOrPanic(w, fmt.Sprintf("```yaml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewYamlEncoder(2, false, ConfiguredYamlPreferences)))) @@ -705,7 +712,7 @@ func documentXMLDecodeKeepNsScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.input)) writeOrPanic(w, "then\n") - writeOrPanic(w, "```bash\nyq -p=xml -o=xml --xml-keep-namespace=false '.' sample.xml\n```\n") + writeOrPanic(w, "```bash\nyq --xml-keep-namespace=false '.' sample.xml\n```\n") writeOrPanic(w, "will output\n") prefs := NewDefaultXmlPreferences() prefs.KeepNamespace = false @@ -729,7 +736,7 @@ func documentXMLDecodeKeepNsRawTokenScenario(w *bufio.Writer, s formatScenario) writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.input)) writeOrPanic(w, "then\n") - writeOrPanic(w, "```bash\nyq -p=xml -o=xml --xml-raw-token=false '.' sample.xml\n```\n") + writeOrPanic(w, "```bash\nyq --xml-raw-token=false '.' sample.xml\n```\n") writeOrPanic(w, "will output\n") prefs := NewDefaultXmlPreferences() @@ -774,7 +781,7 @@ func documentXMLRoundTripScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.input)) writeOrPanic(w, "then\n") - writeOrPanic(w, "```bash\nyq -p=xml -o=xml '.' sample.xml\n```\n") + writeOrPanic(w, "```bash\nyq '.' sample.xml\n```\n") writeOrPanic(w, "will output\n") writeOrPanic(w, fmt.Sprintf("```xml\n%v```\n\n", mustProcessFormatScenario(s, NewXMLDecoder(ConfiguredXMLPreferences), NewXMLEncoder(2, ConfiguredXMLPreferences)))) @@ -792,7 +799,7 @@ func documentXMLSkipDirectrivesScenario(w *bufio.Writer, s formatScenario) { writeOrPanic(w, fmt.Sprintf("```xml\n%v\n```\n", s.input)) writeOrPanic(w, "then\n") - writeOrPanic(w, "```bash\nyq -p=xml -o=xml --xml-skip-directives '.' sample.xml\n```\n") + writeOrPanic(w, "```bash\nyq --xml-skip-directives '.' sample.xml\n```\n") writeOrPanic(w, "will output\n") prefs := NewDefaultXmlPreferences() prefs.SkipDirectives = true