如何使Jq始终返回数组



我的输入可能是:

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>UserTriggerHandler_Test</members>
<members>UserTriggerHandasdler_Test</members>
<name>ApexClass</name>
</types>
<version>52.0</version>
</Package>

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>UserTriggerHandasdler_Test</members>
<name>ApexClass</name>
</types>
<version>52.0</version>
</Package>

Xp值:

{
"Package": {
"@xmlns": "http://soap.sforce.com/2006/04/metadata",
"types": {
"members": "UserTriggerHandasdler_Test",
"name": "ApexClass"
},
"version": "52.0"
}
}

{
"Package": {
"@xmlns": "http://soap.sforce.com/2006/04/metadata",
"types": {
"members": ["UserTriggerHandler_Test", "UserTriggerHandasdler_Test"],
"name": "ApexClass"
},
"version": "52.0"
}
}

我正在尝试将输入传递给这个函数。

classsvalue=`cat manifest/package.xml | xq . | jq '.Package.types | if type=="array" then .[] else . end | select(.name=="ApexClass") |select(.members!="Test")|.members | join(",")'`
echo $classsvalue

但是由于join(",")的存在而失败。我想迫使jq总是返回数组中的成员。这可能吗?

我期望输出分别为"UserTriggerHandasdler_Test""UserTriggerHandasdler_Test,UserTriggerHandasdler_Test"

你要求的不是一个真正的数组,所以我忽略了问题的这一部分。

# Original, unmodified code here
.Package.types |
if type=="array" then .[] else . end |
select(.name=="ApexClass") |
select(.members!="Test") |
.members |
# New code here
if type == "string" then [.] else . end | join(",")

最后一行是关键部分——在执行join()之前,将结果包装在列表中(如果它是字符串)。

如果您已经使用pip install yq安装了https://kislyuk.github.io/yq/捆绑版本的xq,那么您有一些额外的选项可用:

$ xq --help
-h, --help            show this help message and exit
--xml-output, -x      Transcode jq JSON output back into XML and emit it
--xml-item-depth XML_ITEM_DEPTH
Specify depth of items to emit (default 0; use a positive integer to stream large docs)
--xml-dtd             Preserve XML Document Type Definition (disables streaming of multiple docs)
--xml-root XML_ROOT   When transcoding back to XML, envelope the output in an element with this name
--xml-force-list XML_FORCE_LIST
Emit a list for elements with this name even if they occur only once (option can repeat)
--in-place, -i        Edit files in place (no backup - use caution)
--version             show program's version number and exit

--xml-force-list为具有此名称的元素生成一个列表,即使它们只出现一次(选项可以重复)

因此应该能够做到:

cat manifest/package.xml | xq . --xml-force-list "members"

这将确保members始终是一个数组,无论有一个实例或多个实例。

使用https://github.com/martinblech/xmltodict库force_list函数。