Hi,
I am trying to fetch FlowDefinition tag in a file having such a structure summarized below.
__________________________
<GetFlowResponse xmlns="?"><FlowDefinition eventName="KKB_Bireysel_Master" lastModifiedBy="sasdemo" modified="2015-04-21T15:27:05.840Z" created="2015-04-21T15:27:05.840Z" displayName="Campaign279:Shared Data\Decision Tree:KKB Business Context" name="Campaign279_1_DFDFEPEM5ZGTUVVA">
<Description>Campaign279:Shared Data\Decision Tree:KKB Business Context
</Description>
…………….
…………
</FlowDefinition></GetFlowResponse>
__________________________
After having all lines between "<FlowDefinition" and "</FlowDefinition>", using these lines I want to replace another xml file(as below) which also includes FlowDefinition tag with my new FlowDefinition tag. And finally, I want to add "ns2:" prefix to each tag.
__________________________
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtd="?">
<soapenv:Header/>
<soapenv:Body>
<rtd:SubmitSimulation>
<rtd:SessionContextId>?</rtd:SessionContextId>
<rtd:RepositoryName>?</rtd:RepositoryName>
<!--Zero or more repetitions:-->
<rtd:FlowDefinition name="?" displayName="" created="?" modified="?" lastModifiedBy="?" activated="?" eventName="?" timeout="0" timeoutEnabled="false">
…………….
…………
</rtd:FlowDefinition>
<!--Zero or more repetitions:-->
<rtd:GlobalValue name="?">
<!--Zero or more repetitions:-->
<rtd:Value>?</rtd:Value>
</rtd:GlobalValue>
<rtd:SimulationDescription eventName="?" inLibraryName="?" inTableName="?" outLibraryName="?" outTableName="?" statsLibraryName="?" statsTableName="?" overwriteOutputTable="?" multiThreaded="?" timeZoneOptions="?" timeZoneColumnOrId="?"/>
</rtd:SubmitSimulation>
</soapenv:Body>
</soapenv:Envelope>
__________________________
So 3 things to code:
1. Fetch FlowDefinition tag from one xml files.
2. Replace an old FlowDefinition tag in another xml file with the new FlowDefinition tag.
3. Add prefix(ns2:) to each tag.
What is the best way to code those? Any comment will be appreciated. Thanks a lot!
Regards,
Ozge
data have;
infile cards length=len ;
input x $varying2000. len;
cards;
<GetFlowResponse xmlns="?"><FlowDefinition eventName="KKB_Bireysel_Master" lastModifiedBy="sasdemo" modified="2015-04-21T15:27:05.840Z" created="2015-04-21T15:27:05.840Z" displayName="Campaign279:Shared Data\Decision Tree:KKB Business Context" name="Campaign279_1_DFDFEPEM5ZGTUVVA">
<Description>Campaign279:Shared Data\Decision Tree:KKB Business Context
</Description>
…………….
…………
</FlowDefinition></GetFlowResponse>
;
run;
data x;
infile cards length=len ;
input x $varying2000. len;
cards;
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtd="?">
<soapenv:Header/>
<soapenv:Body>
<rtd:SubmitSimulation>
<rtd:SessionContextId>?</rtd:SessionContextId>
<rtd:RepositoryName>?</rtd:RepositoryName>
<!--Zero or more repetitions:-->
<rtd:FlowDefinition name="?" displayName="" created="?" modified="?" lastModifiedBy="?" activated="?" eventName="?" timeout="0" timeoutEnabled="false">
…………….
…………
</rtd:FlowDefinition>
<!--Zero or more repetitions:-->
<rtd:GlobalValue name="?">
<!--Zero or more repetitions:-->
<rtd:Value>?</rtd:Value>
</rtd:GlobalValue>
<rtd:SimulationDescription eventName="?" inLibraryName="?" inTableName="?" outLibraryName="?" outTableName="?" statsLibraryName="?" statsTableName="?" overwriteOutputTable="?" multiThreaded="?" timeZoneOptions="?" timeZoneColumnOrId="?"/>
</rtd:SubmitSimulation>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtd="?">
<soapenv:Header/>
<soapenv:Body>
<rtd:SubmitSimulation>
<rtd:SessionContextId>?</rtd:SessionContextId>
<rtd:RepositoryName>?</rtd:RepositoryName>
<!--Zero or more repetitions:-->
<rtd:FlowDefinition name="?" displayName="" created="?" modified="?" lastModifiedBy="?" activated="?" eventName="?" timeout="0" timeoutEnabled="false">
…………….
…………
</rtd:FlowDefinition>
<!--Zero or more repetitions:-->
<rtd:GlobalValue name="?">
<!--Zero or more repetitions:-->
<rtd:Value>?</rtd:Value>
</rtd:GlobalValue>
<rtd:SimulationDescription eventName="?" inLibraryName="?" inTableName="?" outLibraryName="?" outTableName="?" statsLibraryName="?" statsTableName="?" overwriteOutputTable="?" multiThreaded="?" timeZoneOptions="?" timeZoneColumnOrId="?"/>
</rtd:SubmitSimulation>
</soapenv:Body>
</soapenv:Envelope>
;
run;
data tag;
set have;
retain found;
p=find(x,'<FlowDefinition');
if p then do;
found=1;
x=cats('<ns2:',substr(x,p+1));
end;
p=find(x,'</FlowDefinition>');
if p then do;
x=cats('</ns2:',substr(x,p+2,15));
end;
if find(lag(x),'</FlowDefinition>') then found=0;
if found;
keep x;
run;
data temp;
set x;
retain found;
if find(x,'<rtd:FlowDefinition') then found=1;
if find(lag(x),'</rtd:FlowDefinition>') then found=0;
if not found or (not lag(found) and found);
run;
data want;
set temp;
if not found then output;
else do;
do i=1 to nobs;
set tag point=i nobs=nobs;
output;
end;
end;
run;
Well, my honest opinion? I would suggest you either use a proper XML tool - Oxyen/XML Spy (which is free), or maybe if you need to code it, then .net and XPath. You can then operate on nodes very simply:
- set document a, set document b
- parse document a, set document b
- set node<xyz> from file b to node<xyz> from file a
- write out document b
Now you could do this in SAS, i.e. create a map file, import both data, process that data, then output the files. Personally I find SAS interaction with XML is not very good, mainly as it is a different technology, so best to use the tools built to deal with that technology.
You could, if textually speaking, find that string, i.e. if line read in ="<Flowdefinition>...", then you could just do a:
data _null_;
infile "xyz.xml";
file "xyz2.xml";
input buffer $2000.;
if index(buffer)="<FlowDefinition" then do;
write out your extra bits here...
end;
else put buffer;
run;
However you have to be sure you know whats coming in and what your changing as its just plain text, you can't access "nodes".
Hi RW9,
Thanks for your quick response. Unfortunately I am supposed to maintain it with SAS coding. So, I have to assume it as a text file. I have tried your code sample as below. However, the result is not as expected. I want to get the all lines between FlowDefinition but can get the following results. Do you have any comments?
___________________
FILENAME response '/sas/MPayment_Project/XML_Files/getFlow_resp.xml';
FILENAME flowdef2 '/sas/MPayment_Project/XML_Files/flowdef2.xml';
data _null_;
infile response;
file flowdef2;
input buffer $20000.;
if (index(buffer,"<FlowDefinition")>0) then do;
end;
else; put buffer;
run;
_____________________
RESULT:
TableColumnsAdd(_G_IO_READ_COLUMNS_TO_READ, { { 'TID', 'STRING' }, { 'TCKN_VKN', 'STRING' }, { 'RESULT', 'STRING' }, { 'RESULT_TYPE', 'STRING' }, { 'RESULT_CODE', 'STRING' }, { 'RESULT_DATETIME', 'DATETIME' } });</Expression></CodeNode><CodeNode displayNam
TableRowsAdd(_G_IO_INSERT_TABLE_VALUES, { { _RQST_TCKN_1J2FM_C, _TODAYS_DATETIME } });</Expression></CodeNode><CodeNode displayName="Cell" name="DGEHRLGYPJCAU3HN"><Transition name="ToReply"><Rule>true</Rule><DestinationNodeName>BEFCQDTZUJGITU1X</Destinatio
_CELL_DESC=.;
_RESPONSE_TRACKING_CODE="10380201";
_TOTAL_TREATMENTS = 0;
</Expression></CodeNode><CodeNode displayName="" name="standardReplyContext"><Description/><Transition name="TostandardReplyContext_3"><Rule>true</Rule><DestinationNodeName>standardReplyContext_3</DestinationNodeName></Transition><Expression>_CELL_NAME="";
_CELL_DESC="";
_REPLY_PACK_CODE="1039";
</Expression></CodeNode></FlowDefinition></GetFlowResponse>
The first way I thought about was to have a trigger on/off e.g.:
...
retain flag;
if _n_=1 then flag=0;
if index(buffer,"<FlowDefinition")>0 then flag=1;
if flag=1 then do;
do you processing here
end;
if index(buffer,"/FlowDefinition>")>0 then flag=0;
...
data have;
infile cards length=len ;
input x $varying2000. len;
cards;
<GetFlowResponse xmlns="?"><FlowDefinition eventName="KKB_Bireysel_Master" lastModifiedBy="sasdemo" modified="2015-04-21T15:27:05.840Z" created="2015-04-21T15:27:05.840Z" displayName="Campaign279:Shared Data\Decision Tree:KKB Business Context" name="Campaign279_1_DFDFEPEM5ZGTUVVA">
<Description>Campaign279:Shared Data\Decision Tree:KKB Business Context
</Description>
…………….
…………
</FlowDefinition></GetFlowResponse>
;
run;
data x;
infile cards length=len ;
input x $varying2000. len;
cards;
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtd="?">
<soapenv:Header/>
<soapenv:Body>
<rtd:SubmitSimulation>
<rtd:SessionContextId>?</rtd:SessionContextId>
<rtd:RepositoryName>?</rtd:RepositoryName>
<!--Zero or more repetitions:-->
<rtd:FlowDefinition name="?" displayName="" created="?" modified="?" lastModifiedBy="?" activated="?" eventName="?" timeout="0" timeoutEnabled="false">
…………….
…………
</rtd:FlowDefinition>
<!--Zero or more repetitions:-->
<rtd:GlobalValue name="?">
<!--Zero or more repetitions:-->
<rtd:Value>?</rtd:Value>
</rtd:GlobalValue>
<rtd:SimulationDescription eventName="?" inLibraryName="?" inTableName="?" outLibraryName="?" outTableName="?" statsLibraryName="?" statsTableName="?" overwriteOutputTable="?" multiThreaded="?" timeZoneOptions="?" timeZoneColumnOrId="?"/>
</rtd:SubmitSimulation>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtd="?">
<soapenv:Header/>
<soapenv:Body>
<rtd:SubmitSimulation>
<rtd:SessionContextId>?</rtd:SessionContextId>
<rtd:RepositoryName>?</rtd:RepositoryName>
<!--Zero or more repetitions:-->
<rtd:FlowDefinition name="?" displayName="" created="?" modified="?" lastModifiedBy="?" activated="?" eventName="?" timeout="0" timeoutEnabled="false">
…………….
…………
</rtd:FlowDefinition>
<!--Zero or more repetitions:-->
<rtd:GlobalValue name="?">
<!--Zero or more repetitions:-->
<rtd:Value>?</rtd:Value>
</rtd:GlobalValue>
<rtd:SimulationDescription eventName="?" inLibraryName="?" inTableName="?" outLibraryName="?" outTableName="?" statsLibraryName="?" statsTableName="?" overwriteOutputTable="?" multiThreaded="?" timeZoneOptions="?" timeZoneColumnOrId="?"/>
</rtd:SubmitSimulation>
</soapenv:Body>
</soapenv:Envelope>
;
run;
data tag;
set have;
retain found;
p=find(x,'<FlowDefinition');
if p then do;
found=1;
x=cats('<ns2:',substr(x,p+1));
end;
p=find(x,'</FlowDefinition>');
if p then do;
x=cats('</ns2:',substr(x,p+2,15));
end;
if find(lag(x),'</FlowDefinition>') then found=0;
if found;
keep x;
run;
data temp;
set x;
retain found;
if find(x,'<rtd:FlowDefinition') then found=1;
if find(lag(x),'</rtd:FlowDefinition>') then found=0;
if not found or (not lag(found) and found);
run;
data want;
set temp;
if not found then output;
else do;
do i=1 to nobs;
set tag point=i nobs=nobs;
output;
end;
end;
run;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.
Find more tutorials on the SAS Users YouTube channel.