8

私は多くの XMPP スタンザを生成しており、単体テストでここで利用可能な仕様に対してそれらを検証したいと考えています。

現時点では、ノコギリを使用してこれを達成しています

xml    = Nokogiri::XML( xmpp_stanza)
schema = Nokogiri::XML::Schema( xmpp_schema )

assert schema.valid?( xml )

各スキーマは 1 つの名前空間のみをカバーし、私の 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 に答える