Xpath

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/.

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

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/\.

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/\.

  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/\.