-1

In a PS file I have XML data as below:

For ex:

(<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>onlinerecharge</display-name>

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>

    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
  <welcome-file>index.jsp</welcome-file>

</welcome-file-list>
</web-app>)

I want data to come into a single line.(without any spaces in between)

So how should i approach? (Rexx or JCL which one will be easy to handle and maintain)

Please tell me how to approach as well.

Christoph
  • 47,569
  • 8
  • 87
  • 187
learner
  • 41
  • 6
  • 1
    You can not do it in Raw JCL. If you have an Xml package that does this, it couuld be called from JCL (I do not know whart you have available). It would be easy to do in Rexx, Rexx has a Strip function for removing blanks. It should take a couple of lines in Rexx – Bruce Martin Sep 12 '13 at 21:45

3 Answers3

1

You mention Rexx and JCL, I am going to presume those are merely suggestions and not requirements.

I suggest you look to the z/OS Unix System Services utilities for your solution. You mention "huge XML" and if "huge" means "more than 32K" then you will likely find yourself writing your single line of XML to a file in the Unix file system rather than a PS dataset.

An awk script, for example, could do what you want.

cschneid
  • 10,237
  • 1
  • 28
  • 39
0

You should be clear on the fact that JCL is not, never has been and never will be a programming language. The acronym JCL stands for Job Control Language. You can use JCL to control execution of programs, but you cannot use it to manipulate data in any way. It was never designed to do that.

0
tab = D2C(9)
lf = D2C(10) /* line feed */

/* Remove both tab and new line characters */
input = CHANGESTR( tab, TRANSLATE( input, tab, lf ), '' )
/* or */
input = CHANGESTR( tab, input, '' )
/* to remove only new line characters */

STRIP only remove leading and/or trailing characters.

Use D2C(13)D2C(10) if the file use carriage return line feed instead just line feed.

The code replace all new line characters with tab and then remove all tab characters as it's easier to parse the code then. I've written a kml2csv parser in rexx that can handle google kmz/kml files.

The OS/2 Classic REXX implementation doesn't contain CHANGESTR. A rexx only solution is very slow for large files, but a C/C++ rexx dll is easy to code (I've written one for that specific purpose) that does the job for large KML-files. Regina REXX and new implementations contain a CHANGESTR-function, but you need to specify a parameter for "new needle" even if it is empty.

  • For the question-asker, there are no lined-end/record-delimiters at all. The records will be either fixed-length, or variable-length beginning with an RDW (which you don't have to know about). There's a (Mainframe) rexx answer here, http://stackoverflow.com/a/18792428/1927206, on a question which is marked as duplicate to this. – Bill Woodger Apr 18 '16 at 12:58
  • The line feed characters may not be visible, but they cause it to appear on new lines. Replace those characters to ensure that the data come into a single line without any spaces in between. Each tag value is very dynamic in length, just as the rest and this code take care of it. – Jan-Erik Lärka Apr 19 '16 at 15:08
  • No. They are not there. Nada. Zip. Zero. Zilch. No line/record-endings at all. Or a file-ending. Nothing. It is a PS file (Physical Sequential) on an IBM Mainframe. – Bill Woodger Apr 19 '16 at 15:11
  • That is very logical if it's about restructuring/rewrite the tags so that the tag values end up on the same line in whatever app that display the data. If so, one then would have to rewrite the tags to allow the application to interpret and show it differently (if possible). The other (Mainframe) question state that that it's the actual XML that should be on one line. One can of course replace lf and tab with whatever characters and if there is only spaces and it's already on one line and not as shown, one could use `input = CHANGESTR( '> <', SPACE( input, 1 ), '><' )` in rexx. – Jan-Erik Lärka Apr 21 '16 at 05:28
  • You can't replace lf and tab (or any other control-character) as the are not there. It is not already on one line. It is on separate lines with **NO** control-characters. It is an IBM Mainframe dataset on z/OS. That is the nature of those things. No control-characters. – Bill Woodger Apr 21 '16 at 06:37
  • I should have written: replace lf and tab in my example code with for example the space character or some other character you want to alter. – Jan-Erik Lärka Apr 23 '16 at 08:09
  • But if you change spaces, you'll lose embedded spaces, which is likely an issue in most cases. Strip then concatenate. However, since OP never clearly defined what they want, there may be other limitations (like maximum length of record ~32k). – Bill Woodger Apr 23 '16 at 11:34
  • You're not familiar with REXX apparently. – Jan-Erik Lärka Apr 24 '16 at 13:11
  • Why do you think not? I don't think you've used rexx in the environment that the OP is using. If you had, you'd not have made this answer. – Bill Woodger Apr 24 '16 at 18:38