【发布时间】:2011-02-04 12:47:48
【问题描述】:
我尝试通过特殊属性从 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>
现在我使用以下语法通过属性“type”检索路径元素:
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”元素。
【问题讨论】:
-
我刚刚尝试了您上面的代码,它在这里工作正常。如果您使用更简单的“//path”XPath 而不需要
type属性,它是否有效? -
您确定正在使用 3.1.7.3 并且在您的 Ruby 路径中没有潜伏旧版本吗?尝试检查
puts XPath::VERSION的输出 -
XPath::VERSION是 1.8.7。//pathXPath 按预期工作并提供路径元素。 -
啊哈!那时正在使用旧版本的 rexml。早期版本没有
VERSION常量,因此您看到的1.8.7 实际上是Ruby 版本的顶级VERSION常量,而不是rexml 版本。旧版本不支持完整的 XPath 规范,因此@type不起作用。 -
所以如果你能把它放在一个答案中,我会接受它 - 谢谢!