| PARSE XMLoperand1
                              					  [INTO[PATHoperand2]
                           					 [NAMEoperand3]
                           					 [VALUEoperand4]] | |
| [[ NORMALIZE]NAMESPACEoperand5PREFIXoperand6] | |
| statement... | |
| END-PARSE | (structured mode only) | 
| LOOP | (reporting mode only) | 
This document covers the following topics:
For explanations of the symbols used in the syntax diagram, see Syntax Symbols.
Related Statement: REQUEST
                        		  DOCUMENT
Belongs to Function Group: Internet and XML
The PARSE XML statement allows you to parse XML
                  			 documents from a Natural program. See also Statements for Internet and XML
                     			 Access in the Programming Guide.
               
It is recommended that you use dynamic variables when using the
                  			 PARSE statement, because it is impossible to determine the length
                  			 of a static variable. Using static variables could in turn lead to the
                  			 truncation of the value that is to be written into the variable.
               
For information on Unicode support, see
                  			 PARSE XML in the Unicode and
                     			 Code Page Support documentation.
               
The following are markings used in path strings to represent the different data types in an XML document (on ASCII-based systems):
| Marking | XML Data | Location in Path String | 
|---|---|---|
| ? | Processing instruction (except for <?XML...?>) | end | 
| ! | Comment | end | 
| C | CDATA section | end | 
| @ | Attribute (on mainframes: § or @, depending on session code page and terminal emulation) | before the attribute name | 
| / | Closing tag and/or parent name separator in a path | end or between parent names | 
| $ | Parsed data - character data string | end | 
By using this additional markup in the path string, one can more easily identify the different elements of the XML document in the output document.
To specify the global namespace, use a colon (:) as prefix and an empty URI.
The following Natural system variables are automatically created
                  				for each PARSE XML statement issued:
               
The notation
                     				(r) after
                  				*PARSE-TYPE,
                  				*PARSE-LEVEL,
                  				*PARSE-ROW,
                  				*PARSE-COL and
                  				*PARSE-NAMESPACE-URI is used to indicate the label
                  				or statement number of the statement in which the PARSE was
                  				issued. If (r) is not specified, the
                  				corresponding system variable represents the system variable of the XML data
                  				currently being processed in the active PARSE processing loop.
               
For more information on these system variables, see the System Variables documentation.
Operand Definition Table:
| Operand | Possible Structure | Possible Formats | Referencing Permitted | Dynamic Definition | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| operand1 | C | S | A | U | B | yes | no | |||||||||||||
| operand2 | S | A | U | B | yes | yes | ||||||||||||||
| operand3 | S | A | U | B | yes | yes | ||||||||||||||
| operand4 | S | A | U | B | yes | yes | ||||||||||||||
| operand5 | S | A | A | U | B | yes | yes | |||||||||||||
| operand6 | S | A | A | U | B | yes | yes | |||||||||||||
Syntax Element Description:
| Syntax Element | Description | 
|---|---|
| operand1 | XML
                                 						  Document: operand1represents the XML document in question. The XML document may not be changed
                           						while it is being parsed. If you try to change the XML document during parsing
                           						(by writing into it, for example), an error message will be displayed. | 
| operand2 | Path:   The  Note: See also Example 1 - Using operand2. | 
| operand3 | Data Element Name:   If  See also Example 2 - Using operand3. | 
| operand4 | Data Element Content:   If there is no value, a given dynamic variable will be set
                              						  to  See also Example 3 - Using operand4. | 
| operand5andoperand6
 | Namespace URI and Prefix: The    Namespace normalization is a feature of the
                              						   <myns:myentity xmlns:myns="http://myuri" /> The  
 The namespace  With namespace normalization, all namespace
                              						   The  uri(1) := 'http://namespaces.softwareag.com/natural/demo' pre(1) := 'nat:' If  See also:  Additional Information Concerning PREFIX:
                                 						   In addition, the following applies to the prefix definition: 
 | 
| END-PARSE | End of PARSE XML Statement: In structured mode, the Natural reserved keyword
                              						   In reporting mode, the Natural statement
                              						   | 
| LOOP | 
The following XML code
myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>' 
               			 processed by the following Natural code:
PARSE XML myxml INTO PATH mypath PRINT mypath END-PARSE
produces the following output:
employee employee/@personnel-id employee/full-name employee/full-name/! employee/full-name/first-name employee/full-name/first-name/$ employee/full-name/first-name// employee/full-name/name employee/full-name/name/$ employee/full-name/name// employee/full-name// employee//
The following XML code
myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-  
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>' 
               			 processed by the following Natural code:
PARSE XML myxml INTO PATH mypath NAME myname DISPLAY (AL=39) mypath myname END-PARSE
Note:
produces the following output:
                  
MYPATH MYNAME ---------------------------------- ----------------------------------- employee employee employee/@personnel-id personnel-id employee/full-name full-name employee/full-name/! employee/full-name/first-name first-name employee/full-name/first-name/$ employee/full-name/first-name// first-name employee/full-name/name name employee/full-name/name/$ employee/full-name/name// name employee/full-name// full-name employee// employee
The following XML code
myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-  
         '<employee personnel-id="30016315" >'-
         '<full-name>'-
         '<!--this is just a comment-->'-
         '<first-name>RICHARD</first-name>'-
         '<name>FORDHAM</name>'-
         '</full-name>'-
         '</employee>' 
               			 processed by the following Natural code:
PARSE XML myxml INTO PATH mypath VALUE myvalue DISPLAY (AL=39) mypath myvalue END-PARSE
produces the following output:
MYPATH MYVALUE ---------------------------------- ----------------------------------- employee employee/@personnel-id 30016315 employee/full-name employee/full-name/! this is just a comment employee/full-name/first-name employee/full-name/first-name/$ RICHARD employee/full-name/first-name// employee/full-name/name employee/full-name/name/$ FORDHAM employee/full-name/name// employee/full-name// employee//
The following XML code
myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<nat:employee nat:personnel-id="30016315"'-
         ' xmlns:nat="http://namespaces.softwareag.com/natural/demo">'-
         '<nat:full-Name>'-
         '<nat:first-name>RICHARD</nat:first-name>'-
         '<nat:name>FORDHAM</nat:name>'-
         '</nat:full-Name>'-
         '</nat:employee>' 
               			 processed by the following Natural code:
PARSE XML myxml INTO PATH mypath PRINT mypath END-PARSE
produces the following output:
nat:employee nat:employee/@nat:personnel-id nat:employee/@xmlns:nat nat:employee/nat:full-Name nat:employee/nat:full-Name/nat:first-name nat:employee/nat:full-Name/nat:first-name/$ nat:employee/nat:full-Name/nat:first-name// nat:employee/nat:full-Name/nat:name nat:employee/nat:full-Name/nat:name/$ nat:employee/nat:full-Name/nat:name// nat:employee/nat:full-Name// nat:employee//
Using NORMALIZE
                        				NAMESPACE, the same XML document as in Example 4 with a
                  				different NAMESPACE PREFIX would produce exactly the same
                  				output.
               
XML code:
myxml := '<?xml version="1.0" encoding="ISO-8859-1" ?>'-
         '<natural:employee natural:personnel-id="30016315"'-
         ' xmlns:natural="http://namespaces.softwareag.com/natural/demo">'-  
         '<natural:full-Name>'-
         '<natural:first-name>RICHARD</natural:first-name>'-
         '<natural:name>FORDHAM</natural:name>'-
         '</natural:full-Name>'-
         '</natural:employee>' 
               			 Natural code:
uri(1) := 'http://namespaces.softwareag.com/natural/demo' pre(1) := 'nat:' * PARSE XML myxml INTO PATH mypath NORMALIZE NAMESPACE uri(*) PREFIX pre(*) PRINT mypath END-PARSE
Output of above program:
nat:employee nat:employee/@nat:personnel-id nat:employee/@xmlns:nat nat:employee/nat:full-Name nat:employee/nat:full-Name/nat:first-name nat:employee/nat:full-Name/nat:first-name/$ nat:employee/nat:full-Name/nat:first-name// nat:employee/nat:full-Name/nat:name nat:employee/nat:full-Name/nat:name/$ nat:employee/nat:full-Name/nat:name// nat:employee/nat:full-Name// nat:employee//