2012-08-16 46 views
4

我試圖加載SAML協議模式(specificly這樣的:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但這樣做後:引入nokogiri :: XML ::架構的SyntaxError上架構負載

schema = Nokogiri::XML::Schema(File.read('saml11_schema.xsd')) 

我得到這樣的輸出:

Nokogiri::XML::SyntaxError Exception: Element '{http://www.w3.org/2001/XMLSchema}element', attribute 'ref': The QName value '{urn:oasis:names:tc:SAML:1.0:assertion}Assertion' does not resolve to a(n) element declaration. 

嘗試使用Google搜索錯誤,但沒有線索可能發生的事情,有人可以擺脫一些光?

注意:使用RVM使用Ruby 1.8.7-P370

回答

10

如果引用遠程模式,下載它們並把它們放在一起在一個單一的目錄中。如果您的計算機中已經有xsd文件,只需將它們放在同一個目錄中即可。然後將您的xsd更改爲使用相對路徑。例如:

更改此

<xs:import namespace="http://www.w3.org/XML/1998/namespace" 
schemaLocation="http://www.w3.org/2001/xml.xsd"/> 

<xs:import namespace="http://www.w3.org/XML/1998/namespace" 
schemaLocation="xml.xsd"/> 

然後裹Dir.chdir調用內部驗證代碼。就像這樣:

Dir.chdir(somewhere) do 
schema = Nokogiri::XML::Schema(IO.read('your-schema.xsd')) 
doc = Nokogiri::XML(IO.read(doc_path)) 
schema.validate(doc) 
end 

發現在這個職位的解決方案:

http://ktulu.com.ar/blog/2011/06/26/resolving-validation-errors-using-nokogiri-and-schemas/

10

如果所有xsd文件是在同一個地方,所有的命名空間聲明如下

<import namespace="urn:...:ns:name-1.0" 
     schemaLocation="name-1.0.xsd"/> 

只是使用File.open代替File.read來讀取.xsd文件

Nokogiri將處理打開所有依賴的模式。

+0

這工作得很好,非常感謝。 – Paul 2014-06-16 14:23:38