6

我正在尝试加载 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.

尝试用谷歌搜索错误,但没有关于可能发生的事情的线索,有人可以解释一下吗?

注意:在 Ruby 1.8.7-p370 中使用 RVM

4

2 回答 2

16

如果所有 .xsd 文件都在同一个地方,并且所有命名空间都被声明为

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

只需使用 File.open 而不是 File.read 来读取 .xsd 文件

Nokogiri 将处理打开所有依赖的模式。

于 2014-04-09T18:49:43.170 回答
16

如果您引用远程模式,请下载它们并将它们全部放在一个目录中。如果您的机器中已经有 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
于 2012-08-17T01:36:55.093 回答