【发布时间】:2010-12-30 00:39:18
【问题描述】:
基本上我想提取从节点到根的绝对路径并将其报告给控制台或文件。以下是目前的解决方案:
require "rexml/document"
include REXML
def get_path(xml_doc, key)
XPath.each(xml_doc, key) do |node|
puts "\"#{node}\""
XPath.each(node, '(ancestor::#node)') do |el|
# puts el
end
end
end
test_doc = Document.new <<EOF
<root>
<level1 key="1" value="B">
<level2 key="12" value="B" />
<level2 key="13" value="B" />
</level1>
</root>
EOF
get_path test_doc, "//*/[@key='12']"
问题是它给了我"<level2 value='B' key='12'/>" 作为输出。期望的输出是<root><level1><level2 value='B' key='12'/>(格式可能不同,主要目标是有一个完整的路径)。我只有 XPath 的基本知识,如果能提供任何帮助/指导,以及如何实现这一点,我将不胜感激。
【问题讨论】:
-
我想知道是否有任何使用 REXML 的解决方案。 Nokogiri 安装非常复杂,我没有对服务器框的 root 访问权限,脚本将运行。
-
Nokogiri 安装一点也不复杂。它需要 libxml,但许多 XML 解析器也需要它,所以它已经在很多系统上。试试
locate libxml2 | grep /lib/看看;它应该出现在“/usr/lib/libxml2”之类的地方。如果您无权以 root 身份安装,您可以安装到备用目录,包括您自己的目录。我们很多人使用并推荐RVM 来管理本地 (~/.rvm) Ruby 安装。 -
感谢您的帮助。不幸的是,我必须使用 REXML(现在在多个开发盒上更新这个旧的服务器盒和 cygwin 安装非常昂贵)。从长远来看,我肯定会改用 Nokogiri(主要是因为性能)。