Xpath


#1

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


#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!)


#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:

...

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’]


#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


#5

REXML::XPath(doc, “//terzo[@id=‘3’]”).xpath

Actually XPath.first

But I just tested that (indirectly), and the xpath accessor worked.


#6

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