Fixes xml decode missing tags #1284

This commit is contained in:
Mike Farah 2022-07-29 10:26:50 +10:00
parent b9a1ef89fe
commit 8c3a8c085e
4 changed files with 29 additions and 4 deletions

View File

@ -43,7 +43,7 @@ func (dec *xmlDecoder) Init(reader io.Reader) {
}
func (dec *xmlDecoder) createSequence(nodes []*xmlNode) (*yaml.Node, error) {
yamlNode := &yaml.Node{Kind: yaml.SequenceNode}
yamlNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"}
for _, child := range nodes {
yamlChild, err := dec.convertToYamlNode(child)
if err != nil {
@ -64,7 +64,7 @@ func (dec *xmlDecoder) processComment(c string) string {
func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) {
log.Debug("createMap: headC: %v, footC: %v", n.HeadComment, n.FootComment)
yamlNode := &yaml.Node{Kind: yaml.MappingNode}
yamlNode := &yaml.Node{Kind: yaml.MappingNode, Tag: "!!map"}
if len(n.Data) > 0 {
label := dec.contentName

View File

@ -67,9 +67,9 @@ func pickOperator(d *dataTreeNavigator, context Context, expressionNode *Express
node := unwrapDoc(candidate.Node)
var replacement *yaml.Node
if node.Tag == "!!map" {
if node.Kind == yaml.MappingNode {
replacement = pickMap(node, indicesToPick)
} else if node.Tag == "!!seq" {
} else if node.Kind == yaml.SequenceNode {
replacement, err = pickSequence(node, indicesToPick)
if err != nil {
return Context{}, err

View File

@ -14,6 +14,15 @@ var pickOperatorScenarios = []expressionScenario{
"D0, P[], (doc)::myMap: {hamster: squeek, cat: meow}\n",
},
},
{
description: "Pick keys from map",
skipDoc: true,
document: "!things myMap: {cat: meow, dog: bark, thing: hamster, hamster: squeek}\n",
expression: `.myMap |= pick(["hamster", "cat", "goat"])`,
expected: []string{
"D0, P[], (doc)::!things myMap: {hamster: squeek, cat: meow}\n",
},
},
{
description: "Pick keys from map with comments",
skipDoc: true,

View File

@ -292,6 +292,22 @@ var xmlScenarios = []formatScenario{
expected: "<cat>purrs</cat>\n",
scenarioType: "encode",
},
{
description: "includes map tags",
skipDoc: true,
input: "<cat>purrs</cat>\n",
expression: `tag`,
expected: "!!map\n",
scenarioType: "decode",
},
{
description: "includes array tags",
skipDoc: true,
input: "<cat>purrs</cat><cat>purrs</cat>\n",
expression: `.cat | tag`,
expected: "!!seq\n",
scenarioType: "decode",
},
{
description: "Encode xml: array",
input: "pets:\n cat:\n - purrs\n - meows",