1

これが回答されている場合は申し訳ありませんが、これを機能させる正しい方法が見つかりません。アプリケーションで生成された SVG ダイアグラムを変更するために Nokogiri を使用していますが、ちょっとした問題にぶつかりました。私が扱っているコードは次のようになります。

<svg>
    <g id="1">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="2">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="3">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
<svg>

スクリプトによって分析されるため、これをすべてのドキュメントに追加したいと思います。

<svg>
  <g id="scale" transform="scale(1.0)">
    <g id="1">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="2">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="3">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
   </g>
<svg>

before や after などの方法を試してみましたが、この状況では正しく動作しません。理想的には、ノードセット全体をラップでラップするだけですが、すべてのノードセットではなくすべてのセットで機能させる方法がわかりません。どんなガイダンスでも大歓迎です。

ありがとう!

4

3 に答える 3

1

これが私がそれを行う方法です:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<svg>
    <g id="1">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="2">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="3">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
</svg>
EOT

svg = doc.at('svg')
svg.children = '<g id="scale" transform="scale(1.0)">' + svg.children.to_xml + '</g>'
puts svg.to_xml

実行すると、次のように出力されます。

<svg>
  <g id="scale" transform="scale(1.0)">
    <g id="1">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="2">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="3">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
</g>
</svg>

Nokogiri では、ノードを文字列として定義し、それらをXML::Nodeオブジェクトに変換できます。XML を含む文字列を渡すと、それが NodeSet に変換されるため、醜いコードを書かなくても XML DOM をクリーンかつ明確に操作できます。

于 2013-03-29T19:22:42.567 に答える
0
doc = Nokogiri.XML( raw_svg )
wrapper_g = doc.create_element('g', 'id' => "scale", 'transform' => "scale(1.0)")
doc.xpath('/svg/g').each {|elem| wrapper_g << elem }
doc.root << wrapper_g

オプション - 空のテキスト ノードを削除します。

doc.xpath('//text()').each {|t| t.text =~ /\A\s*\z/ and t.remove }
于 2013-03-29T19:04:06.923 に答える
0

チート シートが役立つ場合があります。

require 'nokogiri'

doc = Nokogiri::XML(%Q{
<svg>
    <g id="1">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="2">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
    <g id="3">
        <text>lorem</text>
        <text>ipsum</text>
    </g>
</svg>
})

svg = doc.xpath('//svg')[0]
wrapper = doc.create_element('g', 'id' => 'scale', 'transform' => 'scale(1.0)')
wrapper.children = svg.children
svg.add_child wrapper

puts doc

svg終了タグのスラッシュを忘れていることに注意してください。

于 2013-03-29T19:04:51.147 に答える