Xpath

A

Alberto Alberto

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
 
P

Phlip

Alberto said:
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!)
 
7

7stud --

Alberto said:
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']
 
P

Phlip

REXML::XPath(doc, "//terzo[@id='3']").xpath

Actually XPath.first

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

7stud --

Phlip said:
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
 
A

Alberto Alberto

7stud said:
Alberto said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,733
Latest member
LonaMonzon

Latest Threads

Top