Xml 使用nokogiri builder添加dtd

Xml 使用nokogiri builder添加dtd,xml,ruby,nokogiri,dtd,Xml,Ruby,Nokogiri,Dtd,我正在使用nokogiri生成svg图片。我想添加正确的xml序言和svg DTD声明,以获得如下内容: <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg> ... ... 使用builder我可以使用指令和声明但我想坚持

我正在使用
nokogiri
生成svg图片。我想添加正确的xml序言和svg DTD声明,以获得如下内容:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg>
...

...
使用
builder
我可以使用
指令
声明
但我想坚持使用nokogiri,因为我在项目中使用它是为了其他目的,我想保持低需求。你有什么想法吗


谢谢

似乎没有任何方法可以使用
Nokogiri::XML::Builder
添加doctype。然而,除非您的工具需要,否则将doctype声明添加到XML文档中的实用性值得怀疑。阅读一些关于为什么使用DTD不是一个好主意的原因,你应该确保你的文档格式正确,并根据外部模式(可能是DTD,或者更强大的东西,如XSD或RELAX-NG)而不是嵌入文档中的DTD来验证它。

这里有一个可能的解决方案,虽然这看起来像一个肮脏的把戏:

#1. I build the svg document
builder = Nokogiri::XML::Builder.new do |xml|
  xml.svg do
    # ...
  end
end

#2. I retrieve the svg root node
svg = builder.doc.xpath("/svg").first

#3. I define and parse an xml document with the required preamble and dtd
str =<<EOS
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1. /DTD/svg11.dtd">
EOS
doc = Nokogiri::XML::Document.parse(str)

#4. I add the svg node to the document above
doc.add_child(svg)
#1。我构建了svg文档
builder=Nokogiri::XML::builder.new do | XML|
xml.svg-do
# ...
结束
结束
#2.我检索svg根节点
svg=builder.doc.xpath(“/svg”)。首先
#3.我使用所需的序言和dtd定义和解析xml文档
str=您现在可以(不知道从哪个版本)使用Node#create_internal_子集来创建DTD节点。有关更多信息,请参阅:


然后向下滚动到“文档类型”部分,以获取示例。

以下是文章底部的一个注释(可能是最近添加的),我认为这会起作用:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.doc.create_internal_subset(
    'html',
    "-//W3C//DTD HTML 4.01 Transitional//EN",
    "http://www.w3.org/TR/html4/loose.dtd"
  )
  xml.root do
    xml.foo
  end
end

puts builder.to_xml

对于那些使用HTML的人来说,Eric Walkers的例子不太管用,因为doctype是自动添加的。您需要先将其删除:

builder = Nokogiri::HTML::Builder.new do |html|
  html.doc.internal_subset.remove
  html.doc.create_internal_subset('html', nil, nil)
end

这将添加HTML5 doctype a.k.a.

链接已断开:/