Lui*_*sVM 5 ruby xsd saml nokogiri
我正在尝试加载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'))
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
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.
Run Code Online (Sandbox Code Playgroud)
尝试用谷歌搜索错误,但没有关于可能发生的事情的线索,有人可以解决一些问题吗?
注意:将RVM与Ruby 1.8.7-p370配合使用
Lui*_*sVM 13
如果您引用远程模式,请下载它们并将它们放在一个目录中.如果您的计算机中已有xsd文件,只需将它们放在同一目录中即可.然后更改您的xsd以使用相对路径.例如:
改变这个
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
Run Code Online (Sandbox Code Playgroud)
至
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="xml.xsd"/>
Run Code Online (Sandbox Code Playgroud)
然后将验证代码包装在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
Run Code Online (Sandbox Code Playgroud)
在这篇文章中找到了解决方案:
http://ktulu.com.ar/blog/2011/06/26/resolving-validation-errors-using-nokogiri-and-schemas/
小智 12
如果所有.xsd文件都位于同一位置,并且所有命名空间都声明为
<import namespace="urn:...:ns:name-1.0"
schemaLocation="name-1.0.xsd"/>
Run Code Online (Sandbox Code Playgroud)
只需使用File.open而不是File.read来读取.xsd文件
Nokogiri将处理打开所有依赖模式.