根据本地 dtd 验证 xml 文件

validating an xml file against a local dtd

我正在尝试根据本地 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: undefined method `validate' for nil:NilClass

'document.external_subset' returns 我没有。

任何人都可以就此问题向我提供建议吗?谢谢

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)