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.
链接已断开:/