【问题标题】:validating an xml file against a local dtd根据本地 dtd 验证 xml 文件
【发布时间】:2017-12-15 12:40:05
【问题描述】:

我正在尝试针对本地 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:NilClass 的未定义方法“验证”

'document.external_subset' 返回零。

有人可以就这个问题给我建议吗?谢谢

【问题讨论】:

  • 当然应该是 document.create_external_subset(...); document.validate?
  • 您从未将该 DTD 与 XML 关联,并且您正在尝试验证 DTD 而不是 XML!
  • 我是 Nokogiri 的新手,对方法不熟悉

标签: ruby xml nokogiri


【解决方案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)

【讨论】:

  • 非常感谢,但我得到的是“没有根元素”。有什么想法吗?
  • 我复制了您的错误并通过在 ruby​​ 2.4.0 上使用 nokogiri 1.8.1 添加上述内容来修复它
  • 谢谢,但当我执行“puts document.external_subset.validate(dtd)”时仍然出现同样的错误
  • 是因为我的 nokogiri 版本吗?我使用的是 1.6.8.1 版本。我会尝试升级它
  • 我看过这本书,但它说要使用 document.validate,然后使用 document.external_subset.validate,所以我不确定代码是否有任何作用。我已经更新了答案,它显示的是验证错误而不是系统错误
猜你喜欢
  • 2015-12-24
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2015-05-18
  • 2010-11-08
  • 2012-05-05
  • 2010-12-25
相关资源
最近更新 更多