2012-02-13 51 views
6

我想用Nokogiri来验证一个XML文档对一打左右的架构。目前我有一个根模式文档,可以导入所有其他模式,并根据该模式进行验证。使用Nokogiri的架构验证

我可以指向XML文件本身中的每个模式文件,并让Nokogiri查看XML文件以验证模式吗?

回答

7

引用多个大纲的正确方法对抗它来验证XML文件与schemaLocation属性:

<?xml version="1.0"?> 
<foo xmlns="http://bar.com/foo" 
    xmlns:bz="http://biz.biz/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://bar.com/foo http://www.bar.com/schemas/foo.xsd 
         http://biz.biz/ http://biz.biz/xml/ns/bz.xsd"> 

对于您的文档中的每个命名空间中列出对空格分隔的值:命名空间URI接下来是关于在哪里找到该名称空间的模式的“提示”。如果您为每个提示提供一个完整的URI,那么你就可以引入nokogiri这样处理的:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri.XML(my_xml) 
schemata_by_ns = Hash[ doc.root['schemaLocation'].scan(/(\S+)\s+(\S+)/) ] 
schemata_by_ns.each do |ns,xsd_uri| 
    xsd = Nokogiri::XML.Schema(open(xsd_uri)) 
    xsd.validate(doc).each do |error| 
    puts error.message 
    end 
end 

免责声明:我从来没有尝试之前,使用多个命名空间的图式与引入nokogiri来验证一个XML文档。因此,我没有直接的经验来保证上述验证将起作用。验证码完全基于Nokogiri's schema validation documentation

+3

@jkjustjoshing这个答案不帮你解决你的问题吗? – Phrogz 2012-02-16 18:48:12

+0

刚刚意识到我从来没有接受你的答案。终于做到了! – jkjustjoshing 2014-06-13 15:36:36

+0

不得不调整这个'doc.root ['xsi:schemaLocation']' – James 2016-05-04 22:58:19