Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 216
  • Last Modified:

xml parsing, output to txt

I have the following code and am trying to output to a file which works but it only grabs the last record in the db and outputs to a txt.  It should loop through all records and output all records the the file.  also, how would I adjust it so that there is a line break after each record in the txt?
<cfif qOrdersToProcess.recordcount GT 0>
 
<cfloop query=qOrdersToProcess>
<cfset xmlString="#orderString#">
<cfif isXML(xmlString)>
<cfset parsed=XmlParse(xmlString)>
<cfset mystring="">
 
<cfloop from=1 to="#arrayLen(parsed.xmlRoot.Order.xmlChildren)#" step=1 index=i>
<cfset mystring=mystring & #evaluate("parsed.xmlRoot.Order.x#i#.xmlText")# & ','>
</cfloop>
 
<cfset myString = Left(myString, Len(myString)-1)>
<cffile action="write" file="#srcDir#CNV#counter##dateFormat(endDate,'mmdd')#"  output="#mystring#">
 
</cfif>
</cfloop>
 
</cfif>

Open in new window

0
COwebmaster
Asked:
COwebmaster
  • 10
  • 9
1 Solution
 
_agx_Commented:
Using action="write" overwrites any existing file.  Since you are inside a loop, each iteration overwrites the previous line, leaving only the last line in the query.

Try using append instead:

<cffile action="append" addNewLine="yes"
file="#srcDir#CNV#counter##dateFormat(endDate,'mmdd')#"  
output="#mystring#">
0
 
_agx_Commented:
Also, have you tried using array notation to eliminate the need for evaluate(..)?

<cfset mystring = listAppend(mystring, parsed.xmlRoot.Order["x"& i ].xmlText)>
0
 
COwebmasterAuthor Commented:
_agx_, is using an array notation better than what I'm doing?  Let me know if you see a better way.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
_agx_Commented:
Yes, it saves a little extra processing that you really do not need.  IMO it is also cleaner code.  

 (BTW, using listAppend will prevent trailing commas in your variable.)
0
 
COwebmasterAuthor Commented:
_agx_, I'm trying to pull back the ids and place them in a ValueList.  I've tried this but it pulls back all ids and repeats them for every iteration..

<cfif isXML(xmlString)>
<cfoutput>#ValueList(qOrdersToProcess.id)#</cfoutput>
<cfset updateids = ValueList(qOrdersToProcess.id)>
<cfoutput>#updateids#</cfoutput>
..

Any ideas?
0
 
_agx_Commented:
Yes, you can't really do that. If you try and combine valueList (all values) with a loop through _individual_ records you are going to get duplicates.

How does this relate to the xml in the original post?  
0
 
COwebmasterAuthor Commented:
actually, I figured it out.
0
 
COwebmasterAuthor Commented:
I just placed an update statment under the cffile statement and that worked.
0
 
_agx_Commented:
So what did you do differently?  Also, is the original question answered as well?
0
 
_agx_Commented:
> I just placed an update statment under the cffile statement and that worked.

Outside of the loop, yes? Otherwise the update would run many, many times.
0
 
COwebmasterAuthor Commented:
Actually, there is one last piece I need to do.  I have a isXML statement in there to make that the record is correctly formatted.  However, I need to make sure the parent node is a certain value, say "Order".  So my xml statement would look like..

<?xml version="1.0" encoding="UTF-8"?><ns1:Order xmlns:ns1="http://www.url.com"><Order><x1>module6-1</x1><x2>module6-2</x2></Order></ns1:Order>

Is there a statement to check for that?                                                            
0
 
COwebmasterAuthor Commented:
Yes, I placed it outside the loop.
0
 
_agx_Commented:
> I need to make sure the parent node is a certain value, say "Order"

You are already referencing the parent node here:

 .... <cfloop from=1 to="#arrayLen(parsed.xmlRoot.Order.xmlChildren)#"
0
 
COwebmasterAuthor Commented:
Ok, but how can I be sure that the parent node is correct?  In other words, a third party will be inserted those xml strings into the db so I want to make sure Order is correct and not Orders and so on.  Is there a way to check for that?
0
 
_agx_Commented:
Yes, you can test for the existence of the key "Order". Then do something else if it was not found

<cfif structKeyExists(parsed.xmlRoot, "Order")>
      do your existing code here
<cfelse>
      "Order" key not found. do something else
</cfif>
0
 
COwebmasterAuthor Commented:
_agx_, would that go on the inside or outside of the cfloop?
0
 
_agx_Commented:
It depends on what you want to do if the key does not exist. But probably Inside the loop, after the isXML check

<cfif isXML(xmlString)>
    <cfset parsed=XmlParse(xmlString)>
    <cfif structKeyExists(parsed.xmlRoot, "Order")>
    ... do the loop and file append here
   </cfif>
</cfif>

Open in new window

0
 
COwebmasterAuthor Commented:
Cool, thx _aqx_
0
 
COwebmasterAuthor Commented:
Thx
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 10
  • 9
Tackle projects and never again get stuck behind a technical roadblock.
Join Now