我在谷歌搜索中找不到任何关于此的内容,但我离 XMPP 专家还很远,所以答案可能很明显。我想知道解析没有显式命名空间的自定义子元素的最佳方法。在这种情况下,我正在解析一些 jingle 元素,其中一些没有任何明确的命名空间(例如,payload-type
,或者parameter
没有明确声明命名空间而只是继承它)。
例如:
<description maxptime="60" media="audio" xmlns="urn:xmpp:jingle:apps:rtp:1">
<payload-type name="opus" clockrate="48000" id="111" channels="2">
<parameter value="10" name="minptime" />
<parameter value="1" name="useinbandfec" />
</payload-type>
...
</description>
在这里,payload-type 和 parameter 都将从 description ( urn:xmpp:jingle:apps:rtp:1
) 继承父命名空间。但是参数也可以在其他地方使用:
<source ssrc="1789460357" xmlns="urn:xmpp:jingle:apps:rtp:ssma:0">
<parameter value="mixed" name="cname" />
...
</source>
在这里,参数将具有urn:xmpp:jingle:apps:rtp:ssma:0
命名空间。
向 ProviderManager 添加自定义提供程序时,它需要传入显式命名空间,因此我不能只传入一个空字符串(ProviderManager.addExtensionProvider 显式检查)。
一种选择是注册parameter
提供者,例如,在每个可能的命名空间下,但这感觉不太好。
另一种选择是更高级别的提供程序(具有显式命名空间的提供程序)解析任何没有命名空间的嵌套子元素,而不是仅仅递归地获取适当的扩展提供程序并调用 parse。似乎向 ProviderManager 注册所有内容是一种更惯用的方式。这可能会使用某种内部版本的提供程序管理器,它只适用于名称。因此,一个元素会首先在官方 ProviderManager 中查找任何匹配的内容,然后尝试其内部版本。
有没有一种惯用的方法来实现这一目标?也许我完全错过了什么?
我确实在这个问题中看到了名称空间是预期的,但我没有看到Jingle RTP spec中列出的任何名称。所以也许我上面的想法之一是正确的,但我想知道哪个最适合图书馆。
谢谢