[英]YANG and Choice - what does the XML look like?
我试图找出将choice
字段从 yang model 实现到其相应配置 xml 的正确语法。不幸的是,RFC 6020 和其他与 Yang 相关的 web 页面中的文档似乎没有显示如何在与 Yang model 通话的实际 XML。
例如,这是我的 YANG model:
container MYMODEL {
container PacketOperationConf {
list RuleID {
key id;
leaf id {
type int32;
}
leaf priority {
type int32;
}
leaf name {
type string;
}
choice type {
case flow {
list action {
key order;
uses mymodel:action;
}
container match {
uses mymodel:match;
}
}
case function {
container function {
}
}
}
}
...
这个容器有对应的 XML:
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running />
</target>
<config>
<MYMODEL xmlns="urn:com:tug:mymodel">
<PacketOperationConf>
<RuleID>
<id>101</id>
<type>
<flow>
<action>
<order>1</order>
<set-dl-src-action>
<address>01:02:03:04:05:06</address>
</set-dl-src-action>
</action>
</flow>
</type>
</RuleID>
</PacketOperationConf>
</MYMODEL>
</config>
</edit-config>
</rpc>
但是当我通过yang2dsdl
运行它时,出现以下错误:
$ yang2dsdl -t edit-config -v rmbn-full-test-1.xml -d /tmp rmbn-full.yang
== Generating RELAX NG schema '/tmp/rmbn-full-edit-config.rng'
Done.
== Validating grammar and datatypes ...
rmbn-full-test-1.xml:13: element type: Relax-NG validity error : Element RuleID has extra content: type
Relax-NG validity error : Extra element RuleID in interleave
rmbn-full-test-1.xml:11: element RuleID: Relax-NG validity error : Element PacketOperationConf failed to validate content
rmbn-full-test-1.xml fails to validate
所以错误发生是因为它不知道如何处理type
元素。 type
元素是我在yang model中选择的部分的名称。
我已经尝试过各种安排,但没有一个奏效。 我也无法在 SOF 或 Google 上找到任何关于 XML 中实施的选择示例的信息。
case 和 choice 都是 RFC 所指的模式节点,但它们也不是数据节点——可以实例化的模式节点。 因此,选择和案例节点永远不会出现在有效实例文档中,它们仅对有效实例文档是什么施加限制。
在您的情况下,这意味着在以下之间进行可选选择(XOR):
<action>
(列表)和/或<match>
(容器)的(逻辑)元素组,<function>
容器。 换句话说,如果<action>
出现在实例文档中, <match>
也可能出现(反之亦然),但<function>
可能不会出现。
这是一个有效的文件(没有实际测试)。
<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target>
<running />
</target>
<config>
<RMBN xmlns="urn:com:tug:rmbn-full">
<PacketOperationConf>
<RuleID>
<id>101</id>
<action>
<order>1</order>
<set-dl-src-action>
<address>01:02:03:04:05:06</address>
</set-dl-src-action>
</action>
</RuleID>
</PacketOperationConf>
</RMBN>
</config>
</edit-config>
</rpc>
以下是 RFC6020(YANG 版本 1.0)中的一些文本,因为您专门询问了该版本(第 7.9 节)。
“选择”语句定义了一组备选方案,在任何时候只能存在其中一个。 参数是一个标识符,后跟一个包含详细选择信息的子语句块。 标识符用于标识模式树中的选择节点。 数据树中不存在选择节点。
选择由多个分支组成,用“case”子语句定义。 每个分支包含多个子节点。 来自至多一个选择分支的节点同时存在。
“case”语句用于定义选择的分支。 它以标识符作为参数,后跟包含详细案例信息的子语句块。
标识符用于标识模式树中的案例节点。 数据树中不存在案例节点。
在“case”语句中,“anyxml”、“choice”、“container”、“leaf”、“list”、“leaf-list”和“uses”语句可用于定义 case 节点的子节点. 所有这些子节点的标识符在一个选择的所有情况下必须是唯一的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.