5

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我可以使用,instruct!declare!我想坚持使用,nokogiri因为我在项目中将它用于其他目的,并且我希望保持低要求。你有什么想法吗?

谢谢

4

5 回答 5

5

以下来自Nokogiri::XML::Builder 页面底部的注释(可能是最近添加的),我认为它可以解决问题:

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
于 2010-08-06T18:21:57.933 回答
2

您现在可以(不知道从哪个版本开始)使用 Node#create_internal_subset 来创建 DTD 节点。欲了解更多信息,请参阅: http: //nokogiri.org/Nokogiri/XML/Builder.html

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

于 2010-06-22T14:29:07.083 回答
1

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

#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)
于 2009-12-29T16:24:26.910 回答
1

对于那些使用 HTML 的人来说,Eric Walkers 的示例不太适用,因为会自动添加文档类型。您需要先将其删除:

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

这将添加 HTML5 doctype aka<!DOCTYPE html>

于 2017-03-31T07:39:02.970 回答
0

似乎没有任何方法可以使用Nokogiri::XML::Builder. 但是,向 XML 文档添加 doctype 声明的实用性值得怀疑,除非您的工具需要它。阅读Henri Sivonen 的 DTD Don't Work on the Web出于某些原因,为什么使用 DTD 不是一个好主意,您应该确保文档格式正确,并根据外部模式(可能是DTD,或者可能是更强大的东西,例如 XSD 或 RELAX-NG),而不是嵌入在文档中的 DTD。

于 2009-12-25T20:41:33.920 回答