当一个格式良好的XML文档中有leafref节点时,如何将有效的YANG实例数据放入该文档中?

当一个格式良好的XML文档中有leafref节点时,如何将有效的YANG实例数据放入该文档中?,xml,yang,Xml,Yang,我很难将两件事结合起来:数据建模和现成的XML工具。具体来说,当YANG模块将leafref添加到另一个模块时,我看不出如何避免使用两个顶级标记 作为一个精简的例子,考虑这两个杨模型和一些有效的实例数据: a、 杨: module a { namespace "aspace"; prefix a; typedef baz-ref { type leafref { path "/a:foo/a:bar/a:baz";

我很难将两件事结合起来:数据建模和现成的XML工具。具体来说,当YANG模块将leafref添加到另一个模块时,我看不出如何避免使用两个顶级标记

作为一个精简的例子,考虑这两个杨模型和一些有效的实例数据:

a、 杨:

module a {
  namespace "aspace";
  prefix a;

  typedef baz-ref {
    type leafref {
      path "/a:foo/a:bar/a:baz";
    }
  }

  container foo {
    container bar {
      leaf baz {
        type string;
      }
    }
  }
}
b、 杨:

module b {
  namespace "bspace";
  prefix b;
  import a {
    prefix a;
  }

  container qux {
    container quux {
      leaf baz {
        type a:baz-ref;
      }
    }
  }
}
valid.xml:

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="aspace"><bar><baz>valid</baz></bar></foo>
<qux xmlns="bspace"><quux><baz>valid</baz></quux></qux>
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="whatever">
<foo xmlns="aspace"><bar><baz>invalid</baz></bar></foo>
<qux xmlns="bspace"><quux><baz>invalid</baz></quux></qux>
</data>
但我不能使用Python的xml模块来解析它,因为它有两个顶级标记:

>>> import xml.etree.ElementTree as ET
>>> tree = ET.ElementTree(file='valid.xml')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 557, in __init__
    self.parse(file)
  File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 597, in parse
    self._root = parser._parse_whole(source)
xml.etree.ElementTree.ParseError: junk after document element: line 3, column 0
>>> 
在实际的项目中,我正在研究a.yang和b.yang是IEEE标准(如果细节有问题,请参考),这意味着我不能触碰它们。但我希望有一种方法可以编写一个新的yang模块,让我在XML文件中的同一个顶级标记下放置,并且仍然让yanglint根据标准验证实例数据。因为我使用的yang模块使用容器而不是分组,所以我不知道如何将它们的数据定义作为新yang模块中某个更高级容器的子级导入

我唯一能做的就是编写多个.xml文件,让yanglint合并它们并验证整个数据树,方法如下:

foo.xml:

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="aspace"><bar><baz>valid</baz></bar></foo>
但是,对于这些特定的yang模型,需要数百个单独的.xml文件,因为ieee802-dot1cb-stream-identification.yang中的数据定义是一个列表,我们预计该列表中会有很多元素


对于这种情况,有没有最佳实践?

您只想解析这样的xml文件吗?尝试以下方法

from simplified_scrapy import SimplifiedDoc, utils

xml = '''<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="aspace"><bar><baz>valid</baz></bar></foo>
<qux xmlns="bspace"><quux><baz>valid</baz></quux></qux>
'''

doc = SimplifiedDoc(xml)
print (doc.foo.baz.text)
print (doc.qux.text)

另外,我在网上找到的实例数据有一个顶级标记,它是通用的,与yang模块中的不同,但是当我运行它时,我从yanglint得到一个错误,与该博客的结果不同。所以我的libyang安装可能有问题。我需要生成这些文件,但我会看看那个模块。我几乎所有的事情都在使用lxml,但在这一点上,如果它能完成任务,我愿意尝试一些不同的东西。
$ yanglint -s b.yang -t config invalid1.xml 
err : Unknown element "data". (/)
$
<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="aspace"><bar><baz>valid</baz></bar></foo>
<?xml version="1.0" encoding="utf-8"?>
<qux xmlns="bspace"><quux><baz>valid</baz></quux></qux>
$ yanglint -m -s b.yang -t config foo.xml qux.xml
from simplified_scrapy import SimplifiedDoc, utils

xml = '''<?xml version="1.0" encoding="utf-8"?>
<foo xmlns="aspace"><bar><baz>valid</baz></bar></foo>
<qux xmlns="bspace"><quux><baz>valid</baz></quux></qux>
'''

doc = SimplifiedDoc(xml)
print (doc.foo.baz.text)
print (doc.qux.text)
valid
valid