When reading in the site element from my xml file using rexml it seems
to be chopping the rest of the text off after the first
The value in the XML file is below
123 street
amstown
amserland
element = REXML::XPath.first(doc, ‘//Site’)
puts element.text #shows 123 Street
How can i get the full data and once i have it i can remove the
I cant find any information on this???
JB
On 8/31/07, John B. [email protected] wrote:
When reading in the site element from my xml file using rexml it seems
to be chopping the rest of the text off after the first
The value in the XML file is below
123 street
amstown
amserland
element = REXML::XPath.first(doc, ‘//Site’)
I’d suggest using a bit more XPath, both text() and a each {} to
iterate through the text nodes (which are distinct):
$ irb -r rexml/document --prompt xmp
a = REXML::Document.new(“123
street
amstown
amserland”)
=> … </>
REXML::XPath.first(a, ‘//Site’).text
=> “123 street”
REXML::XPath.first(a, ‘//Site/text()’).to_s
=> “123 street”
REXML::XPath.each(a, ‘//Site/text()’) {|el| puts el}
123 street
amstown
amserland
=> [“123 street”, “amstown”, “amserland”]
HTH,
Keith
Hi,
At Sat, 1 Sep 2007 05:18:48 +0900,
Keith F. wrote in [ruby-talk:266990]:
I’d suggest using a bit more XPath, both text() and a each {} to
iterate through the text nodes (which are distinct):
$ irb -r rexml/document --prompt xmp
a = REXML::Document.new(“123 street
amstown
amserland”)
=> … </>
REXML::XPath.first(a, ‘//Site’).text
=> “123 street”
Seems like that just REXML::XPath.first(a, ‘//Site’).to_s
returns the whole content.
Keith F. wrote:
REXML::XPath.each(a, ‘//Site/text()’) {|el| puts el}
The assert_xpath plugin wraps that up in this convenient method:
class REXML::Element
def inner_text
return self.each_element( './/text()' ){}.join( '' )
end
end
…
def test_absolve_breaks
a = REXML::Document.new(“123
street
amstown
amserland”)
assert_equal “123 streetamstownamserland”, a.inner_text
end
Come to think of it, that’s not terribly programmer-friendly! Let’s
upgrade
it a little…
assert_equal "123 streetamstownamserland", a.inner_text
assert_equal "123 street\namstown\namserland", a.inner_text("\n")
…
def inner_text(interstitial = ‘’)
return self.each_element( ‘.//text()’ ){}.join(interstitial)
end
On Sat, 01 Sep 2007 04:57:57 +0900, John B. wrote:
When reading in the site element from my xml file using rexml it seems
to be chopping the rest of the text off after the first
Not quite. It gives you the first text element.
The value in the XML file is below
123 street
amstown
amserland
element = REXML::XPath.first(doc, ‘//Site’)
puts element.text #shows 123 Street
How can i get the full data and once i have it i can remove the
I
cant find any information on this???
You can’t find any specific info because there isn’t anything specific.
You have an XML element that contains a text node, an empty element
named
br, another text node, another empty element named br and another text
node. In the XML world,
is a node like any other.
The REXML::Element.texts method is what you are looking for:
$ irb
irb(main):001:0> require “rexml/document”
=> true
irb(main):002:0> doc=REXML::Document.new("123
street
amstown<br/
amserland")
=> … </>
irb(main):003:0> doc.root.texts
=> [“123 street”, “amstown”, “amserland”]
irb(main):004:0> doc.root.texts.join " "
=> “123 street amstown amserland”
Enjoy!