2013-07-25 38 views
3

我正在从LibXML切换到Nokogiri。我在我的代码中有一个方法来检查xml文档是否与Dtd匹配。 Dtd是从数据库中读取的(以字符串形式)。使用Nokogiri验证DTD字符串

这是一个IRB会话

require 'xml' 
doc = LibXML::XML::Document.string('<foo bar="baz" />') #=> <?xml version="1.0" encoding="UTF-8"?> 
dtd = LibXML::XML::Dtd.new('<!ELEMENT foo EMPTY><!ATTLIST foo bar ID #REQUIRED>') #=> #<LibXML::XML::Dtd:0x000000026f53b8> 
doc.validate dtd #=> true 

内的示例据我所知的Nokogiri::XML::Document#validate它是唯一可能的文档中检查的DTD。我如何做到这一点归档相同的结果?

回答

0

我想你需要的是internal_subset

require 'nokogiri' 
doc = Nokogiri::HTML("<!DOCTYPE html>") 
# then you can get the info you want 
doc.internal_subset # Nokogiri::XML::DTD 

# for example you can get name, system_id, external_id, etc 
doc.internal_subset.name 
doc.internal_subset.system_id 
doc.internal_subset.external_id 

这里是Nokogiri::XML::DTD一个完整的文档。

谢谢

+0

我没有使用HTML,所以这不适用于我。我用'Nokogiri :: XML('')'创建了这个文档,这使我留下了'internal_subset => nil'。 – krissi