使用Nokogiri的模式验证

jkj*_*ing 6 ruby xsd nokogiri

我正在尝试使用Nokogiri对十几个模式验证XML文档.目前我有一个导入所有其他模式的根模式文档,我对此进行了验证.

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

Phr*_*ogz 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">
Run Code Online (Sandbox Code Playgroud)

对于文档中的每个命名空间,您列出了一对以空格分隔的值:命名空间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
Run Code Online (Sandbox Code Playgroud)

免责声明:我之前从未尝试使用多个命名空间架构与Nokogiri验证单个XML文档.因此,我没有直接经验来保证上述验证能够奏效.验证代码仅基于Nokogiri的架构验证文档.

  • @jkjustjoshing这个答案对你没有帮助或解决你的问题吗? (3认同)