Как я могу использовать XPATH для возврата массива на основе существования определенного свойства? Ниже приведен раздел моего файла JSON. Под «корнем» находится ряд объектов массива, и НЕКОТОРЫЕ из них содержат свойство «обнаружение». Я хотел бы получить «service_name» каждого объекта массива ТОЛЬКО ЕСЛИ массив объектов (под корнем) содержит свойство «обнаружение».
например, "service_name": должно быть возвращено "IPS"
но для приведенного ниже примера имя_службы НЕ ДОЛЖНО возвращаться, поскольку свойство «обнаружение» отсутствует.
Наконец, есть ли способ объединить приведенный выше запрос в один, чтобы вернуть массив значений «имя_службы» и «обнаружение» вместе на основе одного и того же условия?
Моя текущая команда Power Automate Set Variable:
xpath(xml(variables('varProductsRoot')), '//detection | //service_name')
и, к сожалению, он возвращает ВСЕ имена_служб, даже если компонент, к которому они принадлежат, не содержит свойства «обнаружение».
Ниже приведен пример моего файла JSON, который я пытаюсь проанализировать.
{
"root": {
"fg": [
{
"product_name": "fg",
"remediation": {
"type": "package",
"packages": [
{
"service": "ips",
"service_name": "IPS",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Exploitation"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "22.414"
}
]
},
"detection": {
"attackid": [
51006,
50825
]
}
}
],
"fweb": [
{
"product_name": "fWeb",
"remediation": {
"type": "package",
"packages": [
{
"service": "waf",
"service_name": "Web App Security",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Exploitation"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "0.00330"
}
]
},
"detection": {
"signature_id": [
"090490119",
"090490117"
]
}
}
],
"fcl": [
{
"product_name": "fcl",
"remediation": {
"type": "package",
"packages": [
{
"service": "vuln",
"service_name": "Vulnerability",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Delivery"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "1.348"
}
]
},
"detection": {
"vulnid": [
69887,
2711
]
}
},
{
"product_name": "fcl",
"remediation": {
"type": "package",
"packages": [
{
"service": "ob-detect",
"service_name": "ob Detection",
"kill_chain": {
"step": "sm/SOAR"
},
"link": "https://www.fgd.com/services",
"minimum_version": "1.003"
}
]
}
}
],
"fss": [
{
"product_name": "fss",
"remediation": {
"type": "package",
"packages": [
{
"service": "ips",
"service_name": "IPS",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Exploitation"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "22.414"
}
]
}
}
],
"fadc": [
{
"product_name": "fADC",
"remediation": {
"type": "package",
"packages": [
{
"service": "ips",
"service_name": "IPS",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Exploitation"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "22.414"
}
]
},
"detection": {
"ips_rulename": [
"Error.Log.Remote.Code.Execution",
"Server.cgi-bin.Path.Traversal"
]
}
},
{
"product_name": "fADC",
"remediation": {
"type": "package",
"packages": [
{
"service": "waf",
"service_name": "Web App Security",
"description": "Detects and Blocks attack attempts",
"kill_chain": {
"step": "Exploitation"
},
"link": "https://fgd.fnet.com/updates",
"minimum_version": "1.00038"
}
]
},
"detection": {
"sigid": [
1002017267,
1002017273
]
}
}
],
"fsm": [
{
"product_name": "fsm",
"remediation": {
"type": "package",
"packages": [
{
"service": "ioc",
"service_name": "IOC",
"kill_chain": {
"step": "sm/SOAR"
},
"link": "https://www.fgd.com/services",
"minimum_version": "0.02355"
}
]
}
}
]
}
}
Заранее спасибо, Никос
Привет @Skin, я только что обновил свой пост с образцом JSON. Спасибо
Это сработает для вас. Я разбил его на три этапа для удобства...
Он содержит ваш JSON, как вы указали. Переменная определяется как Object
.
Инициализируйте строковую переменную, содержащую следующее выражение...
xml(variables('JSON'))
... который (как вы знаете) преобразует JSON в XML.
Это переменная Array
, которая будет извлекать значения всех элементов service_name
, где существует элемент detection
, используя следующее выражение...
xpath(xml(variables('XML')), '//detection/..//service_name/text()')
Вуаля! У вас есть значения в массиве.
Отличный ответ! Очень хорошо описано. Большое спасибо :)
Не могли бы вы опубликовать свой json AS TEXT, чтобы мы могли дать вам правильный ответ?