Самый простой способ обеспечить отношения, которые вы хотите, состоит в том, чтобы выводить типы схем подмножества путем ограничения от типов схемы чертежа. Звучит так, будто эта лодка уже отплыла.
Как и другие здесь, я не знаю каких-либо инструментов, которые делают это из коробки (хотя, если Петру Гардеа говорит, что QT Assistant может, стоит следить).
Одно из осложнений состоит в том, что существует два способа просмотра отношения подмножества / надмножества, которое вы хотите проверить: (1) каждый документ (или элемент), принятый как действительный по схеме 1, также принимается как действительный по схеме 2 (без ссылки на сделанные присвоения типа) или (2) типизированные документы, полученные путем проверки (в том, что спецификация вызывает информационный бюллетень после схемы) по схемам 1 и 2, находятся в соответствующем отношении друг к другу: if элемент или атрибут действителен в дереве 1, он действителен в дереве 2; тип, назначенный ему в дереве 1, является ограничением типа, назначенного ему в дереве 2; и т. д. Если схемы 1 и 2 были разработаны независимо, вероятность того, что их типы связаны деривацией, плоха, поэтому, я думаю, у вас есть первый подход к этому вопросу.
Проблема, однако, определенно разрешима в любой форме. Для любой схемы (я использую этот термин тщательно) есть по определению конечное число типов и конечное число объявленных имен элементов; следует, что существует конечное число (возможно, большое) пар имя / тип элемента.
Алгоритм может пойти примерно так.
Как вы можете видеть, достаточно сложно и утомительно, что вы действительно хотите автоматизировать этот анализ, и он также достаточно сложный, что легко чтобы понять, почему это широко не предлагается как готовая функция. Но, конечно, было бы интересно закодировать.
Чтобы получить ключи верхнего уровня в виде потока, вы можете использовать клавиши []. Таким образом, одним из решений вашей конкретной проблемы будет:
jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"'
keys
создает имена ключей в отсортированном порядке; если вы хотите их в исходном порядке, используйте keys_unsorted
.
Другой альтернативой, которая производит ключи в исходном порядке, является:
jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'
Фильтры @csv и @tsv также могут быть рассмотрены здесь, например
jq -r 'to_entries[] | [.key, .value.ip] | @tsv'
производит:
host1 10.1.2.3
host2 10.1.2.2
host3 10.1.18.1
Вышло очень элегантное решение
jq 'with_entries(.value |= .ip)'
Какой из них
{
"host1": "10.1.2.3",
"host2": "10.1.2.2",
"host3": "10.1.18.1"
}
Вот фрагмент jqplay для воспроизведения с помощью: https://jqplay.org/ s / Jb_fnBveMQ
Функция with_entries
преобразует каждый объект в список объектов в Key / Value-pair, поэтому мы можем получить доступ к .key
или .value
соответственно, мы обновление (переписывание) каждого KV-элемента .value
с полем .ip
с помощью оператора |=
обновления |=