当前位置: 首页 > 知识库问答 >
问题:

使用Opendaylight通过NETCONF检索列表时出现错误“在XML输入中复制命名空间”

毕魁
2023-03-14

我使用Opendaylight(版本0.10.1)作为NETCONF客户端向Netopeer2服务器发送请求。
My YANG模型是一个第三方模型,由多个模块组成,其中包含多个属性和多个列表元素。
这转化为一个XML请求和响应对,看起来像这样(简化):

请求:

<rpc message-id="m-3" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <get-config>
        <source>
            <running/>
        </source>
        <filter xmlns:ns0="urn:ietf:params:xml:ns:netconf:base:1.0" ns0:type="subtree">
            <TopElement xmlns="top-element">
                <id>1</id>
            </TopElement>
        </filter>
    </get-config>
</rpc>

答复:

<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="m-3">
    <data>
        <TopElement xmlns="top-element">
            <id>1</id>
            <ParentElement xmlns="parent-element">
                <id>1</id>
                <ChildElement1 xmlns="child-element1">
                    <id>1</id>
                    <attributes>
                        ...
                    </attributes>
                </ChildElement1>
                <ChildElement1 xmlns="child-element1">
                    <id>2</id>
                    <attributes>
                        ...
                    </attributes>
                </ChildElement1>
                <ChildElement2 xmlns="child-element2">
                    <id>1</id>
                    <attributes>
                        ...
                    </attributes>
                </ChildElement2>
                <ChildElement1 xmlns="child-element1">
                    <id>3</id>
                    <attributes>
                        ...
                    </attributes>
                </ChildElement1>
            </ParentElement>
        </TopElement>
    </data>
</rpc-reply>

但是,这样的请求会导致“主机已关闭”错误,我已尝试使用Karaf日志文件进行调查。我把这个问题追查到了akka。图案AskTimeoutException超时,这似乎是由XML响应的分析错误引起的:

2020-04-08T09:09:11,733 | ERROR | nioEventLoopGroupCloseable-3-1 | AbstractFuture                   | 42 - com.google.guava - 25.1.0.jre |  -  | RuntimeException while executing runnable CallbackListener{org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc$1@165744d4} with executor MoreExecutors.directExecutor()
java.lang.IllegalArgumentException: Failed to parse data response [data: null]
    at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformer.toRpcResult(NetconfMessageTransformer.java:285) ~[386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformer.toRpcResult(NetconfMessageTransformer.java:75) ~[386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc$1.onSuccess(NetconfDeviceRpc.java:60) ~[386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc$1.onSuccess(NetconfDeviceRpc.java:57) ~[386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1355) ~[42:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:398) ~[42:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1024) [42:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:866) [42:com.google.guava:25.1.0.jre]
    at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:689) [42:com.google.guava:25.1.0.jre]
    at org.opendaylight.netconf.sal.connect.netconf.listener.UncancellableFuture.set(UncancellableFuture.java:45) [386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator.processMessage(NetconfDeviceCommunicator.java:338) [386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator.onMessage(NetconfDeviceCommunicator.java:270) [386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator.onMessage(NetconfDeviceCommunicator.java:49) [386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    at org.opendaylight.netconf.nettyutil.AbstractNetconfSession.handleMessage(AbstractNetconfSession.java:64) [379:org.opendaylight.netconf.netty-util:1.6.1]
    at org.opendaylight.netconf.nettyutil.AbstractNetconfSession.channelRead0(AbstractNetconfSession.java:187) [379:org.opendaylight.netconf.netty-util:1.6.1]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) [71:io.netty.transport:4.1.34.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) [66:io.netty.codec:4.1.34.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) [66:io.netty.codec:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337) [71:io.netty.transport:4.1.34.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323) [66:io.netty.codec:4.1.34.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297) [66:io.netty.codec:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext.html" target="_blank">access$600(AbstractChannelHandlerContext.java:38) [71:io.netty.transport:4.1.34.Final]
    at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:350) [71:io.netty.transport:4.1.34.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [68:io.netty.common:4.1.34.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [68:io.netty.common:4.1.34.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:495) [71:io.netty.transport:4.1.34.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) [68:io.netty.common:4.1.34.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [68:io.netty.common:4.1.34.Final]
    at java.lang.Thread.run(Thread.java:748) [?:?]
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[-1,-1]
Message: Duplicate namespace "child-element1" element "ChildElement1" in XML input
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.read(XmlParserStream.java:383) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.read(XmlParserStream.java:321) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.read(XmlParserStream.java:403) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.read(XmlParserStream.java:321) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.read(XmlParserStream.java:403) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.parse(XmlParserStream.java:214) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream.traverse(XmlParserStream.java:244) ~[410:org.opendaylight.yangtools.yang-data-codec-xml:2.1.10]
    at org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformer.toRpcResult(NetconfMessageTransformer.java:281) ~[386:org.opendaylight.netconf.sal-netconf-connector:1.9.1]
    ... 34 more

真的是因为列表吗?XML符合RFC 7950:

7.8.5。XML编码规则

列表被编码为一系列XML元素,列表中的每个条目对应一个XML元素。每个元素的本地名称是列表的标识符,其名称空间是模块的XML名称空间(参见第7.1.3节)。整个列表周围没有XML元素。

任何建议都将不胜感激。谢谢!

共有3个答案

庾君博
2023-03-14

我想这里的问题是,服务器的响应在/TopElement/ParentElement处包含列表条目(按以下顺序):

  • ChildElement1[id=1]
  • ChildElement1[id=2]
  • ChildElement2[id=1]
  • ChildElement1[id=3]

所以我假设ChildElement1和ChildElement2都是列表。这里的问题是,ChildElement1的3个条目不是连续的,中间有一个ChildElement2在中间。

我在NETCONF规范中没有看到任何内容表明这是一个问题,但显然OpenDaylight有一个问题。我假设OpenDaylight认为对ChildElement2条目的处理意味着ChildElement1列表已结束被删除,因此在它稍后找到另一个条目后,它会将其视为一个单独的列表,并在您拥有的XML输入中生成异常Duplate命名空间“child-element1”元素“ChildElement1”。

如果您想避免这个问题,我建议对来自服务器的响应中的条目进行排序,以便同一列表的条目站在一起。

因此,重申一下,问题不在于单个列表条目的顺序,而在于您正在交错属于两个不同列表的条目。

宗涵蓄
2023-03-14

我可能偶然发现了什么
我用不同的NETCONF服务器(ConfD)和相同的型号尝试了同样的方法,似乎效果很好
我注意到的一个区别是,在TopElement或ParentElement上执行get请求时,ConfD会按顺序返回子列表,即首先返回所有ChildElement1元素,然后返回所有ChildElement2元素,即使它们是按随机顺序创建的。另一方面,Sysrepo-netopeer2以创建元素的相同顺序返回XML树,因此ChildElement1元素和ChildElement2元素是混合的(参见我的示例)<我不确定它们是否都是好的方法,或者是否有正确的方法和错误的方法。

编辑:在我最初的帖子中,我引用了RFC 7950,但不知何故遗漏了相关部分:

如果列表是“按用户排序”的,则表示列表条目的XML元素必须按照用户指定的顺序出现;否则,顺序取决于实现。表示列表条目的XML元素可以与列表同级的元素交错,除非列表定义了RPC或操作输入或输出参数。

所以,假设我的假设是正确的,在这种情况下,ODL实际上限制太多了。

邴宏大
2023-03-14

我不确定我是否知道这里的答案,但问题是否只是一些列表项的命名相同?如:

<ChildElement1 xmlns="child-element1">

我知道id是独一无二的,但这正是我最突出的地方。

 类似资料:
  • 我有一个SOAP服务的问题,它返回直接嵌入在SOAP XML中的XML文档。SOAP响应如下所示:

  • 问题内容: 当使用正则表达式按复合类名称搜索时,BeautifulSoup返回空列表。 例: 我需要对课程的选择非常精确。有任何想法吗? 问题答案: 不幸的是,当您尝试对包含多个类的类属性值进行正则表达式匹配时,会将正则表达式分别应用于每个单个类。 这一切都是因为是一个很特别的多值属性,每一次你解析HTML的一个的树建设者(取决于解析器选择)内部分裂从一个类的字符串值入类(报价列表的docstri

  • 我的WSDL上有以下标签: 这些类型随后被鉴定为s0、s1。。。名称空间。 问题是名称空间endpoint(=)http://xxxxx/ws)是否需要是有效的url 如果endpoint不再存在-是否意味着我们需要再次为Web服务重新生成存根代理? 注意:Web服务本身的终结点与名称空间的终结点不同,并且仍然存在。

  • 我试图从XML类型列中检索某个节点。 我的代码在本地环境中的Tomcat中运行良好,但当我创建EAR文件并将其部署到WeSphere Application Server中时。我得到一个错误: 引起:java.lang.NoClassDefFoundError:oracle.xdb.XMLType 在oracle.jdbc.driver.NamedTypeAccessor.getOracleObj

  • 该代码基于用户输入的列表。然后显示列表并要求输入y/n。如果是,它会显示回车,并允许您输入用逗号分隔的数字。这很好。 然而,在当循环之后,它会启动我还不明白的collections.frequency。只有当数字像12一样一个接一个地输入时,它才起作用,然后点击输入更多的数字,直到按下n。这打破了循环。并显示重复的列表。 然而,如果一次将所有数字输入到一行中,如12、23、55等,则不起作用。它不

  • 问题内容: 我有以下问题,我需要删除“ cfdi”的“ cfdi_”: 我使用了命名空间来解决这个问题,但是每个节点都重复了这些命名空间,因此无法消除它们,如果您能帮助我,我将不胜感激 结果1: 第二次尝试: 结果: 我的代码更大,并且重复了太多次,我不知道如何消除它们 问题答案: 从XML来看,第二个结果是自给自足的XML元素,而第一个结果只能是定义前缀名称空间的其他元素的一部分。因此,我想所有