关于模式加载的Nokogiri :: XML :: Schema SyntaxError

时间:2012-08-16 22:25:49

标签: ruby xsd nokogiri saml

我正在尝试加载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一起使用

2 个答案:

答案 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将处理打开所有依赖模式。