我有以下要使用YANG建模的XML。 XML包含一个节点列表,每个节点包含一个邻居节点列表。
<nodes>
<node>
<id>1</id>
<node>
<id>2</id>
</node>
</node>
<node>
<id>3</id>
<node>
<id>4</id>
</node>
</node>
</nodes>
请在我尝试创建的YANG模型下方找到。遗憾的是,Yang不支持在分组中使用循环引用。
grouping node {
list node {
leaf id {
type int32;
}
uses node;
}
}
container nodes {
uses node;
}
我在draft-ietf-netmod-routing-cfg-16和ietf mail archive中看到,一种模拟递归的方法是使用leafref。上面的xml如何用grouping和leafref建模?
答案 0 :(得分:1)
正如您所说,不支持使用分组进行递归。 最简单的方法是拥有一个平面的节点列表,其中每个节点都有一个父节点,称为叶引用。 像这样:
container nodes {
list node {
key id;
leaf id { type int32; }
leaf parent-id {
type leafref {
path "../../node/id";
}
}
}
}
等效的XML将是:
<nodes>
<node>
<id>1</id>
<node>
<node>
<id>2</id>
<parent-id>1</parent-id>
</node>
<node>
<id>3</id>
<node>
<node>
<id>4</id>
<parent-id>3</parent-id>
</node>
</nodes>
您可以做相反的事情,即节点引用其子节点(通过leafref叶子列表)而不是其父节点。
当然,直接递归使用同一数据节点确实可行:
container nodes {
list node {
key id;
leaf id { type int32; }
list node {
key id;
leaf id { type int32; }
list node {
key id;
leaf id { type int32; }
// and so on
}
}
}
}
但是这不允许无限深层次。不过,我会避免使用这种模式,这不是一个干净的模型设计。