5

私はnokogirisvg画像を生成するために使用しています。次のようなものを取得するために、正しいxmlプリアンブルとsvgDTD宣言を追加したいと思います。

<?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 に答える
0

を使用して Doctype を追加する方法はないようNokogiri::XML::Builderです。ただし、XML ドキュメントに doctype 宣言を追加することは、ツールで必要とされない限り、あまり役に立ちません。Henri Sivonen 著 DTD はウェブ上で機能しないを読んでください。なぜなら、DTD を使用することがあまり良い考えではない理由がいくつかあります。代わりに、ドキュメントが適切な形式であることを確認し、外部スキーマ (ドキュメント内に埋め込まれた DTD ではなく、DTD、または XSD や RELAX-NG などのより強力なものである可能性があります。

于 2009-12-25T20:41:33.920 に答える