Can not get CDATA out of XML node using Nokogiri

Input appreciated: Trying to get data from a CDATA field out of an xml doc using Nokogiri.

This is the node: <ATTACHED_DOCUMENT> </ATTACHED_DOCUMENT>

When I query I am getting at best empty string, where I should expect the text “insert PDF code here”. This is what I have tried, without success:

xml_request_doc.xpath(“//attached_document”) returns: [#<Nokogiri::XML::Element:0x1252bfe name=“attached_document”>]

xml_request_doc.xpath(“//attached_document/text()”) returns:

xml_request_doc.xpath(“//attached_document”).value returns: NoMethodError Exception: undefined method `value’ for [#<Nokogiri::XML::Element:

xml_request_doc.xpath(“//attached_document”).inner_html returns: “”

Any thoughts where going wrong (I am successfully using Nokogiri for every other element in my doc.

Thx!

One way would be to check the children until you get the CData node:

parent_node = xml_request_doc.xpath("//attached_document")

# this assumes parent_node is not nil cdata_node = parent_node.children.detect {|n| n.cdata?}

# i think you can then just do: cdata_node.value

Thanks Gary, I had been trying the .children, and tried what you suggested to be sure, and I get nil as the return value for cdata_node = parent_node.children.detect {|n| n.cdata?}

It is very strange - the following is the xml in text before creating the Nokogiri doc, and it says <ATTACHED_DOCUMENT> has no children, and does not seem to be any other objects inside the attached_document node in the Nokogiri doc:

<USER_INFO login=\"aaa\" password=\"bbb\" /> <REQUEST request_type=\"NEW\"> <SUPPLEMENT_ORDER_DETAIL report_id=\"ccc\" ordered_by=\"ddd\" phone=\"eee\" email=\"fff\"       faxed_docs=\"ggg\" rush=\"T\" reason=\"hhh\">     <TRADE_SUPPLEMENT account_number=\"iii\" creditor=\"jjj\" included_bankruptcy=\"T\">       <ATTACHED_DOCUMENT> <![CDATA[zzz]]> </ATTACHED_DOCUMENT>    </TRADE_SUPPLEMENT> </SUPPLEMENT_ORDER_DETAIL> </REQUEST>"

maybe try .cdatas on the parent node rather than children. Not sure about Nokogiri but such a method exists for rexml/document.

maybe try .cdatas on the parent node rather than children. Not sure about Nokogiri but such a method exists for rexml/document.

Thanks. It does work with REXML, out of the box, no fiddling. I like Nokogiri's speed but am finding it harder to work with - maybe it is just getting used to and I don't understand things, but aside from this what else I find a little strange is when Nokogiri matches on a node/element it wants everything in lowercase, even if my xml is uppercase. Anyhow +1 for old REXML.

maybe try .cdatas on the parent node rather than children. Not sure about Nokogiri but such a method exists for rexml/document.

This is beautiful in REXML, just give me what I want, no negotiation -- back to the joy of Rails:

REXML::XPath.first(xml_request_doc, "//ATTACHED_DOCUMENT").cdatas