我正在生成大量的XMPP节,并希望在我的单元测试中根据可用的规范here验证它们。
目前我正在使用Nokogiri以类似
的方式实现这一目标xml = Nokogiri::XML( xmpp_stanza)
schema = Nokogiri::XML::Schema( xmpp_schema )
assert schema.valid?( xml )
现在这样可以正常工作,除非它被报告为无效,因为每个模式只覆盖一个名称空间,而我的XMPP节有多个名称空间。例如:
Invalid XML: Element '{http://jabber.org/protocol/pubsub}pubsub': No matching global element declaration available, but demanded by the strict wildcard.
我是如何处理多个模式来验证单个节的?我是不是首先将它拆分为命名空间并单独验证每个?
答案 0 :(得分:1)
我能够通过importing一个模式实现这一目标。
e.g。
<xs:import namespace="http://base.google.com/ns/1.0" schemaLocation="public/xsd/google_base.xsd"/>
答案 1 :(得分:0)
如果您没有其他可用的命名空间,您也可以更改架构以在架构中的相关“任意”节点上包含processContents =“lax”指令,并说可以不验证命名空间没有架构。我确实喜欢这样:
schema_xml = Nokogiri::XML(File.read(path))
schema_xml.xpath("//xs:any[@namespace='##other']",
{"xs" => "http://www.w3.org/2001/XMLSchema"}).each do |node|
node["processContents"] = "lax"
end
schema = Nokogiri::XML::Schema.from_document( schema_xml )
当然,这意味着不会验证外部名称空间。