我正在尝试针对本地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。
有人可以就此问题向我提出建议吗?感谢
答案 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)