it works!

This commit is contained in:
Mike Farah 2022-01-15 11:40:05 +11:00
parent deee3c1f60
commit 46a419aad6
4 changed files with 40 additions and 33 deletions

View File

@ -142,16 +142,17 @@ EOM
assertEquals "$expected" "$X" assertEquals "$expected" "$X"
} }
testOutputXmlMultiPropertiesMultietc() { testOutputXmComplex() {
cat >test.yml <<EOL cat >test.yml <<EOL
a: {b: {c: ["cat"]}}asd a: {b: {c: ["cat", "dog"], +f: meow}}
EOL EOL
read -r -d '' expected << EOM read -r -d '' expected << EOM
<a> <a>
<b> <b f="meow">
<c>cat</c> <c>cat</c>
</b>asd <c>dog</c>
</b>
</a> </a>
EOM EOM

View File

@ -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. 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. 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: 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 ```xml
<cat name="tiger">meow</cat> <cat name="tiger">meow</cat>
``` ```

View File

@ -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. 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. 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: 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 ```xml
<cat name="tiger">meow</cat> <cat name="tiger">meow</cat>
``` ```
@ -58,7 +54,7 @@ animal:
``` ```
## Parse xml: attributes ## 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: Given a sample.xml file of:
```xml ```xml
@ -79,7 +75,7 @@ cat:
``` ```
## Parse xml: attributes with content ## 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: Given a sample.xml file of:
```xml ```xml
@ -271,24 +267,18 @@ for x --></x>
``` ```
then then
```bash ```bash
yq e -p=xml '.' sample.xml yq e -p=xml -o=xml '.' sample.xml
``` ```
will output will output
```yaml ```xml
# before cat <!-- before cat --><cat><!-- in cat before -->
cat: <x>3<!-- multi
# in cat before line comment
x: "3" # multi for x --></x><!-- before y -->
# line comment <y><!-- in y before
# for x in d before -->
# before y <d>z<!-- in d after --></d><!-- in y after -->
</y><!-- in_cat_after -->
y: </cat><!-- after cat -->
# in y before
# in d before
d: z # in d after
# in y after
# in_cat_after
# after cat
``` ```

View File

@ -217,13 +217,13 @@ var xmlScenarios = []xmlScenario{
}, },
{ {
description: "Parse xml: attributes", 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: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cat legs=\"4\">\n <legs>7</legs>\n</cat>", input: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cat legs=\"4\">\n <legs>7</legs>\n</cat>",
expected: "D0, P[], (doc)::cat:\n +legs: \"4\"\n legs: \"7\"\n", expected: "D0, P[], (doc)::cat:\n +legs: \"4\"\n legs: \"7\"\n",
}, },
{ {
description: "Parse xml: attributes with content", 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: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cat legs=\"4\">meow</cat>", input: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cat legs=\"4\">meow</cat>",
expected: "D0, P[], (doc)::cat:\n +content: meow\n +legs: \"4\"\n", 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" { if s.scenarioType == "encode" {
documentXmlEncodeScenario(w, s) documentXmlEncodeScenario(w, s)
} else if s.scenarioType == "roundtrip" {
documentXmlRoundTripScenario(w, s)
} else { } else {
documentXmlDecodeScenario(t, w, s) 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))) 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) { func TestXmlScenarios(t *testing.T) {
for _, tt := range xmlScenarios { for _, tt := range xmlScenarios {
testXmlScenario(t, tt) testXmlScenario(t, tt)