1

特別な属性によって SVG ドキュメントから要素を選択しようとしています。簡単な例を設定しました。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">
  <g id='1'>
    <path id='2' type='A'/>
    <rect id='3' type='B'/>
  </g>
</svg>

ここで、次の構文を使用して、パス要素をその属性「タイプ」で取得します。

require 'rexml/document'
include REXML
xmlfile = File.new "xml_as_specified_above.svg"
xmldoc = Document.new(xmlfile)
XPath.match( xmldoc.root, "//path[@type]" )

http://www.w3schools.com/xpath/xpath_syntax.aspから直接構文。この式がパス要素を選択することを期待しますが、これは次のとおりです。

>> XPath.match( xmldoc.root, "//path[@type]" )
=> []

では、属性によってパス要素をアドレス指定するための XPath の正しい構文は何ですか? それとも REXML (3.1.7.3 を使用) にバグがありますか? 「rect」要素も取得するためのプラスポイント。

4

4 に答える 4

3

完全な XPath 仕様をサポートしていない古いバージョンの rexml がピックアップされているようです。

の出力をチェックしてputs XPath::VERSION、3.1.73 が表示されていることを確認してください。

于 2011-02-04T13:27:47.777 に答える
0

デフォルトの名前空間を考慮する必要があります。XPath 1.0では、プレフィックス(たとえばsvg)を名前空間URIにバインドしてから、のhttp://www.w3.org/2000/svgようなパスを使用する必要があります//svg:path[@type]。XPath評価のためにプレフィックスをURIにバインドする方法は、使用するXPath APIによって異なります。APIドキュメントにメソッドまたはプロパティが見つからない場合、RubyAPIでどのようにバインドされるかわかりません。自分自身、そして多分誰か他の人が後で私たちに話しに来ます。

于 2011-02-04T12:58:37.067 に答える
0

これは最もよくある質問です: デフォルトの名前空間の問題です。

解決:

それ以外の:

//path[@type]

使用する

//svg:path[@type]
于 2011-02-04T15:37:29.923 に答える
0

私たちの多くは最近、ReXML や Hpricot (もう 1 つの初期の Ruby XML パーサー) の代わりに Nokogiri を使用しています。

Nokogiri は XPath アクセサーと CSS アクセサーの両方をサポートしているため、使い慣れた HTML タイプのパスを使用してノードを取得できます。

require 'nokogiri'

svg = %q{<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">
  <g id='1'>
    <path id='2' type='A'/>
    <rect id='3' type='B'/>
  </g>
</svg>
}

doc = Nokogiri::XML(svg)
puts doc.search('//svg:path[@type]')
puts doc.search('svg|path[@type]')
puts doc.search('path[@type]')

puts doc.search('//svg:rect')
puts doc.search('//svg:rect[@type]')
puts doc.search('//svg:rect[@rect="B"]')
puts doc.search('svg|rect')
puts doc.search('rect')

# >> <path id="2" type="A"/>
# >> <path id="2" type="A"/>
# >> <path id="2" type="A"/>

# >> <rect id="3" type="B"/>
# >> <rect id="3" type="B"/>
# >> <rect id="3" type="B"/>
# >> <rect id="3" type="B"/>

最初のパスは名前空間を持つ XPath です。2 つ目は名前空間を持つ CSS です。3 つ目は名前空間のない CSS です。Nokogiri は人間に優しいため、名前空間がなぜ優れているかを認識していれば、いくつかの方法で名前空間を処理および不要にすることができます。

于 2011-02-04T13:44:21.530 に答える