验证针对本地dtd的xml文件

时间:2017-12-15 12:40:05

标签: ruby xml nokogiri

我正在尝试针对本地dtd验证xml文件。

以下是从书中获取的示例代码:

    dtd = Nokogiri::XML::Document.parse(%{<!ELEMENT rubycookbook (recipe+)>
    <!ELEMENT recipe (title?, problem, solution, discussion, seealso?)+>
    <!ELEMENT titlexx (#PCDATA)>
    <!ELEMENT problem (#PCDATA)>
    <!ELEMENT solution (#PCDATA)>
    <!ELEMENT discussion (#PCDATA)>
    <!ELEMENT seealso (#PCDATA)>})


    open('cookbook.xml', 'w') do |f|
      f.write %{<?xml version="1.0"?>
      <rubycookbook>
       <recipe>
         <title>A recipe</title>
         <problem>A difficult/common problem</problem>
         <solution>A smart solution</solution>
         <discussion>A deep solution</discussion>
         <seealso>Pointers</seealso>
       </recipe>
      </rubycookbook>
      }
    end

document = Nokogiri::XML(File.open('cookbook.xml'))
document.external_subset.validate

当我运行以下命令时,

  

document.external_subset.validate

我收到以下错误消息:

  

NoMethodError:nil的未定义方法`validate':NilClass

'document.external_subset'使我返回nil。

有人可以就此问题向我提出建议吗?感谢

1 个答案:

答案 0 :(得分:1)

require 'nokogiri'

dtd = Nokogiri::XML::Document.parse(%{<!ELEMENT rubycookbook (recipe+)>
    <!ELEMENT recipe (title?, problem, solution, discussion, seealso?)+>
    <!ELEMENT titlexx (#PCDATA)>
    <!ELEMENT problem (#PCDATA)>
    <!ELEMENT solution (#PCDATA)>
    <!ELEMENT discussion (#PCDATA)>
    <!ELEMENT seealso (#PCDATA)>})

open('cookbook.xml', 'w') do |f|
  f.write %{<?xml version="1.0"?>
  <rubycookbook>
   <recipe>
     <title>A recipe</title>
     <problem>A difficult/common problem</problem>
     <solution>A smart solution</solution>
     <discussion>A deep solution</discussion>
     <seealso>Pointers</seealso>
   </recipe>
  </rubycookbook>
  }
end

the_dtd = Nokogiri::XML::DTD.new('dtd', dtd)
document = Nokogiri::XML(File.open('cookbook.xml'))
p the_dtd.validate(document)