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:
<primo>
<secondo>
<terzo id='3'>
<terzo/>
<secondo/>
<quarto>
...
<quarto/>
<primo>
Xpath: //terzo[@id='3']
Output:
//primo/secondo/terzo[id='3']
Thank's in advance!
Alberto
···
--
Posted via http://www.ruby-forum.com/.
Phlip1
(Phlip)
2
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!)
···
--
Phlip
7stud
(7stud --)
3
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:
<primo>
<secondo>
<terzo id='3'>
<terzo/>
<secondo/>
<quarto>
...
<quarto/>
<primo>
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
<primo>
<secondo>
<terzo id='3'>
</terzo>
</secondo>
<quarto>
...
</quarto>
<terzo id='3'>
</terzo>
</primo>
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']
···
--
Posted via http://www.ruby-forum.com/\.
7stud
(7stud --)
4
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
···
--
Posted via http://www.ruby-forum.com/\.
Phlip1
(Phlip)
5
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:
<primo>
<secondo>
<terzo id='3'>
<terzo/>
<secondo/>
<quarto>
...
<quarto/>
<primo>
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
<primo>
<secondo>
<terzo id='3'>
</terzo>
</secondo>
<quarto>
...
</quarto>
<terzo id='3'>
</terzo>
</primo>
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
···
--
Posted via http://www.ruby-forum.com/\.