Hi all,
I have a question:
I would like to know if it is possible, using REXML, get full path from
root, of document XML, to leaf node, through a XPath query?
example with l’XML:
...
Xpath: //terzo[@id=‘3’]
Output:
//primo/secondo/terzo[id=‘3’]
Thank’s in advance!
Alberto
Alberto Alberto wrote:
Xpath: //terzo[@id=‘3’]
Output:
/primo/secondo/terzo[id=‘3’]
You meant / not //.
Try this:
REXML::XPath(doc, “//terzo[@id=‘3’]”).xpath
That’s off the top of my head; advise me if it didn’t work! I know
there’s a
.xpath or .path in there somewhere…
(And I suspect Nokogiri provides a better XML ride!)
Alberto Alberto wrote:
I would like to know if it is possible, using REXML, get full path from
root, of document XML, to leaf node, through a XPath query?
example with l’XML:
...
Xpath: //terzo[@id=‘3’]
Output:
//primo/secondo/terzo[id=‘3’]
Is that really considered XML?
require “rexml/document”
include REXML
xml = <<TO_END_OF_XML
…
TO_END_OF_XML
doc = Document.new xml
target = “//terzo[@id=‘3’]”
paths = []
XPath.each(doc, target) do |element|
parents = []
while true
parent = element.parent
break if parent.name == “”
parents << parent.name
element = parent
end
path = parents.reverse.join(’/’)
paths << “//#{path}#{target[1…-1]}”
end
puts *paths
–output:–
//primo/secondo/terzo[@id=‘3’]
//primo/terzo[@id=‘3’]
Phlip wrote:
Try this:
REXML::XPath(doc, “//terzo[@id=‘3’]”).xpath
That’s off the top of my head; advise me if it didn’t work! I know
there’s a
.xpath or .path in there somewhere…
When I output element.xpath, I get:
/primo/secondo/terzo
/primo/terzo
REXML::XPath(doc, “//terzo[@id=‘3’]”).xpath
Actually XPath.first
But I just tested that (indirectly), and the xpath accessor worked.
7stud – wrote:
Alberto Alberto wrote:
I would like to know if it is possible, using REXML, get full path from
root, of document XML, to leaf node, through a XPath query?
example with l’XML:
...
Xpath: //terzo[@id=‘3’]
Output:
//primo/secondo/terzo[id=‘3’]
Is that really considered XML?
require “rexml/document”
include REXML
xml = <<TO_END_OF_XML
…
TO_END_OF_XML
doc = Document.new xml
target = “//terzo[@id=‘3’]”
paths = []
XPath.each(doc, target) do |element|
parents = []
while true
parent = element.parent
break if parent.name == “”
parents << parent.name
element = parent
end
path = parents.reverse.join(’/’)
paths << “//#{path}#{target[1…-1]}”
end
puts *paths
–output:–
//primo/secondo/terzo[@id=‘3’]
//primo/terzo[@id=‘3’]
I try this solution and it works, but now my question is after operation
parents << parent.name
over parents array can I obtain a value of attributes with someting like
this?
.attributes.each_attribute {|attr|
p attr.expanded_name+" => "+attr.value
}
Thank’s a lot for quickly support.
Alberto