2

当涉及到 xq/jq 时,我不太精通......我一直在尝试解析这样的东西:

<?xml version="1.0"?>
<groups>
  <a>
    <count>1</count>
    <max>46</max>
    <name>foo</name>
  </a>
  <a>
    <count>3</count>
    <max>81</max>
    <name>bar</name>
  </a>
</groups>

进入这个:(注意数字周围没有双引号)

[
  {
    "count": 1,
    "max": 46,
    "name": "foo"
  },
  {
    "count": 3,
    "max": 81,
    "name": "bar"
  }
]

我知道先验 xq 无法丢弃什么是数字和什么是字符串。所以我尝试了一些使用'select'的jq工件,但我无法让它工作......所以现在我必须用'sed'删除双引号......我知道这很不雅xq 可以轻松做到。

是否有人知道传递给 xq 的参数以查找特定元素(即“count”和“max”)并仅对这些元素应用转换(即“tonumber”),而其余元素不受影响?

提前非常感谢!

4

2 回答 2

2

由于xqkislyuk/yq捆绑在一起用于jqDSL,因此您可以使用该tonumber函数将其转换为.count等效的数字

xq '.groups.a | map( (.count, .max) |= tonumber )' xml
[
  {
    "count": 1,
    "max": 46,
    "name": "foo"
  },
  {
    "count": 3,
    "max": 81,
    "name": "bar"
  }
]
于 2020-11-20T10:47:06.083 回答
1

完成任务的一般方法是递归遍历所有节点并尝试将它们转换为数字。

xq 'walk(if type == "string" then tonumber? // . else . end)'

如果您只想更新输入的特定部分,您可以这样做:

xq '.groups.a |= walk(if type == "string" then tonumber? // . else . end)'

另请参阅将字符串转换为数字jq

于 2021-07-07T17:07:23.357 回答