我正在尝试加载SAML协议架构(具体为:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作后:
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.
尝试使用谷歌搜索错误,但没有关于可能发生的事情的线索,是否会有人发光?
注意:将RVM与Ruby 1.8.7-p370一起使用
答案 0 :(得分:12)
如果您引用远程模式,请下载它们并将它们放在一个目录中。如果您的计算机中已有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/
答案 1 :(得分:12)
如果所有.xsd文件都位于同一位置,并且所有名称空间都声明为
<import namespace="urn:...:ns:name-1.0"
schemaLocation="name-1.0.xsd"/>
只需使用File.open而不是File.read来读取.xsd文件
Nokogiri将处理打开所有依赖模式。