如何解决YANG和Choice-XML是什么样的?
我正在尝试找出正确的语法,以实现将yang模型中的choice字段实现为其对应的配置xml。不幸的是,RFC 6020和其他与Yang有关的网页中的文档似乎并未显示如何在与Yang模型相关的实际XML中使用choice
字段。
例如,这是我的YANG模型:
container RMBN {
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 rmbn:action;
}
container match {
uses rmbn: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>
<RMBN xmlns="urn:com:tug:rmbn-full">
<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>
</RMBN>
</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模型中我选择的部分的名称。
我已经尝试过各种安排,但是都没有奏效。我也无法在SOF或Google上找到关于以XML实现的选择示例的任何信息。
解决方法
大小写和选择都是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)的一些文本,因为您专门询问了该版本(Section 7.9)。
“ choice”语句定义了一组备选方案,其中只有一个 可能随时存在。参数是一个标识符, 然后是包含详细选择的部分子陈述 信息。该标识符用于标识中的选择节点 模式树。 数据树中不存在选择节点。
选择项由多个分支组成,用“ case”定义 子陈述。每个分支包含许多子节点。的 最多一个选择分支的节点存在于同一节点 时间。
“ case”语句用于定义选择的分支。它 以标识符作为参数,后跟一个 包含详细案例信息的子陈述。
标识符用于标识架构树中的案例节点。 案例节点在数据树中不存在。
在“ case”语句中,“ anyxml”,“ choice”,“ container”, “ leaf”,“ list”,“ leaf-list”和“ uses”语句可用于 定义案例节点的子节点。所有这些的标识符 子节点在所有情况下都必须是唯一的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。