8

我正在生成很多 XMPP 节,并希望根据我的单元测试中可用的规范来验证它们。

目前我正在使用 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.

我如何处理多个模式来验证单个节?我是否打算首先按名称空间将其拆分并单独验证每个?

4

2 回答 2

1

我能够通过将一个模式导入另一个模式来实现这一点。

例如

<xs:import namespace="http://base.google.com/ns/1.0" schemaLocation="public/xsd/google_base.xsd"/>  
于 2011-03-07T00:35:57.280 回答
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 )

当然,这意味着不会验证外部命名空间。

于 2013-01-30T17:27:02.587 回答