mirror of
https://github.com/mikefarah/yq.git
synced 2025-01-27 08:55:37 +00:00
Fixed update children problem with xml
This commit is contained in:
parent
b2a3cb47a7
commit
b0ff65d6b7
@ -1,3 +1,2 @@
|
||||
{name: Mike}
|
||||
---
|
||||
{name: Bob}
|
||||
- cat
|
||||
- dog
|
@ -1 +1 @@
|
||||
<cat>3</cat>
|
||||
<zoo><thing><frog>boing</frog></thing></zoo>
|
@ -129,21 +129,20 @@ zoo:
|
||||
```
|
||||
|
||||
## Parse xml: force all as an array
|
||||
Because of the way yq works, when updating everything you need to update the children before the parents. By default `..` will match parents first, so we reverse that before updating.
|
||||
|
||||
Given a sample.xml file of:
|
||||
```xml
|
||||
<zoo><thing><frog>boing</frog></thing></zoo>
|
||||
```
|
||||
then
|
||||
```bash
|
||||
yq -oy '([..] | reverse | .[]) |= [] + .' sample.xml
|
||||
yq -oy '.. |= [] + .' sample.xml
|
||||
```
|
||||
will output
|
||||
```yaml
|
||||
zoo:
|
||||
thing:
|
||||
frog: boing
|
||||
- zoo:
|
||||
- thing:
|
||||
- frog:
|
||||
- boing
|
||||
```
|
||||
|
||||
## Parse xml: attributes
|
||||
|
@ -45,7 +45,11 @@ func assignUpdateOperator(d *dataTreeNavigator, context Context, expressionNode
|
||||
return context, err
|
||||
}
|
||||
|
||||
for el := lhs.MatchingNodes.Front(); el != nil; el = el.Next() {
|
||||
//traverse backwards through the context -
|
||||
// like delete, we need to run against the children first.
|
||||
// (e.g. consider when running with expression '.. |= [.]' - we need
|
||||
// to wrap the children first
|
||||
for el := lhs.MatchingNodes.Back(); el != nil; el = el.Prev() {
|
||||
candidate := el.Value.(*CandidateNode)
|
||||
|
||||
rhs, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS)
|
||||
|
@ -364,11 +364,10 @@ var xmlScenarios = []formatScenario{
|
||||
expected: "zoo:\n animal:\n - cat\n",
|
||||
},
|
||||
{
|
||||
description: "Parse xml: force all as an array",
|
||||
subdescription: "Because of the way yq works, when updating everything you need to update the children before the parents. By default `..` will match parents first, so we reverse that before updating.",
|
||||
input: "<zoo><thing><frog>boing</frog></thing></zoo>",
|
||||
expression: "([..] | reverse | .[]) |= [] + .",
|
||||
expected: "- zoo:\n - thing:\n - frog:\n - boing\n",
|
||||
description: "Parse xml: force all as an array",
|
||||
input: "<zoo><thing><frog>boing</frog></thing></zoo>",
|
||||
expression: ".. |= [] + .",
|
||||
expected: "- zoo:\n - thing:\n - frog:\n - boing\n",
|
||||
},
|
||||
{
|
||||
description: "Parse xml: attributes",
|
||||
|
Loading…
Reference in New Issue
Block a user