我想知道我们是否可以在其中一个元素leaf,list等中定义自定义字段或属性。例如:这可能吗?如果可能的话,我们如何定义这些字段。
model Animal{
leaf amphibian{
type String;
custom "Frog"; // Custom field which has a value "Frog"
}
}
答案 0 :(得分:2)
如果通过"属性"你指的是一个新的YANG关键词,对你有特殊意义,然后是。 YANG支持扩展。来自RFC6020:
"扩展" statement允许定义新语句 在杨语中。这个新的语句定义可以 由其他模块导入和使用。
语句的参数是一个标识符,它是新的关键字 扩展名,后面必须跟一个子语句块 持有详细的扩展信息。 "扩展"的目的 statement是定义一个关键字,以便可以导入和使用它 通过其他模块。
扩展名可以像普通的YANG语句一样使用 语句名称后跟一个参数(如果由...定义) 扩展和可选的子语句块。声明的声明 name是通过组合模块的前缀来创建的 已定义扩展名,冒号(":")和扩展名的关键字, 没有交错的空白。
extension custom {
argument object;
description "A new YANG keyword that carries special semantics.";
}
prefix:custom "Frog"; // usage of an extension
上例中的argument
关键字是extension
关键字的可选子语句,用于指示新关键字采用(强制)参数(字符串,例如{{1 }})。
"参数"声明,可选,作为参数a string是关键字参数的名称。如果不 参数声明存在,关键字期望没有参数 它被使用了。 7.17.2
为什么需要new关键字的命名参数? YANG可以映射到YIN,表示为XML的替代语法,这个名称变得很重要。
参数的名称用在YIN映射中,用作它 XML属性或元素名称,取决于参数" yin- 元素"声明。 7.17.2
您不能限制此参数的值空间 - YANG编译器将始终将其识别为字符串。但是没有什么可以阻止你要求实现期望某些值 - 毕竟你正在定义新关键字的含义。
"Frog"
描述语句包含规范性文本,因此如果您的扩展包含extension custom {
argument value;
description
"The value of "custom" statement's argument MUST be an integer
in the range from 1 to 5.";
}
prefix:custom 3;
子语句,并声明该语句的参数值必须是一个整数",那么实现将具有尊重这一文本。
如果你的意思是"属性"在用YANG建模的实例文档(XML,JSON,...)中,答案是否定的 - 在大多数情况下。 Pure YANG不支持建模属性。
但是,有一个已发布的YANG扩展规范,允许定义这些属性。您可以阅读有关here(RFC7952)的更多信息。该扩展名称为description
,用于定义YANG元数据,这些附加信息可增加可能已使用YANG建模的数据。这是一个例子:
annotation
根据上述模型,这将是一个有效的XML实例:
module using-annotation {
namespace "org:example:using-annotation";
prefix "ua";
import ietf-yang-metadata {
prefix "md";
}
md:annotation my-annotation {
type string;
description "This is my annotation.";
}
container top {
leaf some-leaf {
type string;
}
}
}
它允许XML属性几乎在任何地方都有效。
阅读RFC7952也可能有助于了解 <ua:top xmlns:ua="org:example:using-annotation">
<ua:some-leaf ua:my-annotation="Yay!">foo</ua:some-leaf>
</ua:top>
语句的实际工作方式以及如何正确定义YANG扩展。