The PRESENT keyword in COBOL represents sophisticated XML element detection and comprehensive document structure validation capabilities within modern enterprise programming environments, providing advanced XML processing mechanisms for element presence verification, enhanced document parsing features for conditional processing, and intelligent structure detection capabilities that enable precise XML element checking, optimal document navigation workflows, and systematic XML content analysis while maintaining parsing accuracy, ensuring predictable element detection, and enabling flexible XML processing architectures across business applications requiring exact document structure validation, conditional element processing, and reliable XML content verification throughout sophisticated data integration and modern API processing scenarios.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199*> Basic PRESENT usage in XML processing WORKING-STORAGE SECTION. 01 WS-XML-DATA. 05 WS-XML-DOCUMENT PIC X(5000). 05 WS-XML-LENGTH PIC 9(4) COMP. 05 WS-ELEMENT-NAME PIC X(50). 05 WS-ELEMENT-VALUE PIC X(500). 05 WS-ATTRIBUTE-NAME PIC X(30). 05 WS-ATTRIBUTE-VALUE PIC X(100). 01 WS-PARSING-FLAGS. 05 WS-CUSTOMER-PRESENT PIC X VALUE 'N'. 05 WS-ADDRESS-PRESENT PIC X VALUE 'N'. 05 WS-PHONE-PRESENT PIC X VALUE 'N'. 05 WS-EMAIL-PRESENT PIC X VALUE 'N'. 01 WS-CUSTOMER-DATA. 05 WS-CUSTOMER-ID PIC X(10). 05 WS-CUSTOMER-NAME PIC X(50). 05 WS-CUSTOMER-ADDRESS PIC X(100). 05 WS-CUSTOMER-PHONE PIC X(15). 05 WS-CUSTOMER-EMAIL PIC X(50). 01 WS-PARSING-COUNTERS. 05 WS-ELEMENTS-FOUND PIC 9(4) VALUE 0. 05 WS-OPTIONAL-ELEMENTS PIC 9(4) VALUE 0. 05 WS-REQUIRED-ELEMENTS PIC 9(4) VALUE 0. PROCEDURE DIVISION. MAIN-XML-PROCESSING. DISPLAY "=== XML PRESENT DEMONSTRATION ===" PERFORM SETUP-XML-DOCUMENT PERFORM PARSE-XML-WITH-PRESENT PERFORM DISPLAY-PARSING-RESULTS DISPLAY "=== XML PROCESSING COMPLETE ===" STOP RUN. SETUP-XML-DOCUMENT. DISPLAY "Setting up sample XML document..." *> Create sample XML document STRING '' '
' ' ' DELIMITED BY SIZE INTO WS-XML-DOCUMENT END-STRING COMPUTE WS-XML-LENGTH = FUNCTION LENGTH(FUNCTION TRIM(WS-XML-DOCUMENT)) DISPLAY "✅ XML document prepared (" WS-XML-LENGTH " characters)" PARSE-XML-WITH-PRESENT. DISPLAY "Parsing XML document using PRESENT..." *> Initialize parsing flags MOVE 'N' TO WS-CUSTOMER-PRESENT MOVE 'N' TO WS-ADDRESS-PRESENT MOVE 'N' TO WS-PHONE-PRESENT MOVE 'N' TO WS-EMAIL-PRESENT *> Parse XML document XML PARSE WS-XML-DOCUMENT THRU XML-PARSE-END PROCESSING PROCEDURE HANDLE-XML-EVENTS ON EXCEPTION DISPLAY "❌ XML parsing error occurred" NOT ON EXCEPTION DISPLAY "✅ XML parsing completed successfully" END-XML XML-PARSE-END. EXIT. HANDLE-XML-EVENTS. *> This procedure handles XML parsing events EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' PERFORM HANDLE-START-ELEMENT WHEN 'CONTENT-CHARACTER' PERFORM HANDLE-ELEMENT-CONTENT WHEN 'END-OF-ELEMENT' PERFORM HANDLE-END-ELEMENT WHEN 'START-OF-DOCUMENT' DISPLAY "📄 Starting XML document processing" WHEN 'END-OF-DOCUMENT' DISPLAY "📄 Completed XML document processing" END-EVALUATE HANDLE-START-ELEMENT. MOVE XML-TEXT TO WS-ELEMENT-NAME ADD 1 TO WS-ELEMENTS-FOUND *> Check if specific elements are present EVALUATE WS-ELEMENT-NAME WHEN 'customer' MOVE 'Y' TO WS-CUSTOMER-PRESENT DISPLAY "✅ Customer element PRESENT" ADD 1 TO WS-REQUIRED-ELEMENTS WHEN 'address' MOVE 'Y' TO WS-ADDRESS-PRESENT DISPLAY "✅ Address element PRESENT" ADD 1 TO WS-OPTIONAL-ELEMENTS WHEN 'phone' MOVE 'Y' TO WS-PHONE-PRESENT DISPLAY "✅ Phone element PRESENT" ADD 1 TO WS-OPTIONAL-ELEMENTS WHEN 'email' MOVE 'Y' TO WS-EMAIL-PRESENT DISPLAY "✅ Email element PRESENT" ADD 1 TO WS-OPTIONAL-ELEMENTS WHEN OTHER DISPLAY "📋 Element found: " WS-ELEMENT-NAME END-EVALUATE HANDLE-ELEMENT-CONTENT. MOVE XML-TEXT TO WS-ELEMENT-VALUE *> Process content based on current element EVALUATE WS-ELEMENT-NAME WHEN 'name' MOVE WS-ELEMENT-VALUE TO WS-CUSTOMER-NAME DISPLAY " 📝 Customer name: " WS-CUSTOMER-NAME WHEN 'phone' MOVE WS-ELEMENT-VALUE TO WS-CUSTOMER-PHONE DISPLAY " 📞 Phone number: " WS-CUSTOMER-PHONE WHEN 'email' MOVE WS-ELEMENT-VALUE TO WS-CUSTOMER-EMAIL DISPLAY " 📧 Email address: " WS-CUSTOMER-EMAIL END-EVALUATE HANDLE-END-ELEMENT. *> Element processing completed DISPLAY "🔚 End of element: " WS-ELEMENT-NAME DISPLAY-PARSING-RESULTS. DISPLAY " " DISPLAY "=== XML PARSING RESULTS ===" DISPLAY "Element Presence Analysis:" DISPLAY " Customer element: " WS-CUSTOMER-PRESENT DISPLAY " Address element: " WS-ADDRESS-PRESENT DISPLAY " Phone element: " WS-PHONE-PRESENT DISPLAY " Email element: " WS-EMAIL-PRESENT DISPLAY " " DISPLAY "Parsing Statistics:" DISPLAY " Total elements found: " WS-ELEMENTS-FOUND DISPLAY " Required elements: " WS-REQUIRED-ELEMENTS DISPLAY " Optional elements: " WS-OPTIONAL-ELEMENTS *> Validate required elements are present IF WS-CUSTOMER-PRESENT = 'Y' DISPLAY "✅ All required elements present" ELSE DISPLAY "❌ Missing required elements" END-IF *> Count optional elements present COMPUTE WS-OPTIONAL-COUNT = 0 IF WS-ADDRESS-PRESENT = 'Y' ADD 1 TO WS-OPTIONAL-COUNT END-IF IF WS-PHONE-PRESENT = 'Y' ADD 1 TO WS-OPTIONAL-COUNT END-IF IF WS-EMAIL-PRESENT = 'Y' ADD 1 TO WS-OPTIONAL-COUNT END-IF DISPLAY "📊 Optional elements present: " WS-OPTIONAL-COUNT " of 3" *> Display extracted customer data DISPLAY " " DISPLAY "Extracted Customer Data:" IF WS-CUSTOMER-NAME NOT = SPACES DISPLAY " Name: " WS-CUSTOMER-NAME END-IF IF WS-CUSTOMER-PHONE NOT = SPACES DISPLAY " Phone: " WS-CUSTOMER-PHONE END-IF IF WS-CUSTOMER-EMAIL NOT = SPACES DISPLAY " Email: " WS-CUSTOMER-EMAIL END-IFJohn Smith ' ' ' '123 Main St ' 'New York ' '10001 ' ' ' '555-0123 ' 'john.smith@email.com ' '
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341*> Advanced PRESENT usage for complex XML processing 01 WS-ORDER-PROCESSING. 05 WS-ORDER-XML PIC X(10000). 05 WS-ORDER-LENGTH PIC 9(5) COMP. 05 WS-CURRENT-ELEMENT PIC X(50). 05 WS-ELEMENT-DEPTH PIC 9(2) VALUE 0. 01 WS-ORDER-STRUCTURE. 05 WS-ORDER-HEADER-PRESENT PIC X VALUE 'N'. 05 WS-CUSTOMER-INFO-PRESENT PIC X VALUE 'N'. 05 WS-BILLING-ADDR-PRESENT PIC X VALUE 'N'. 05 WS-SHIPPING-ADDR-PRESENT PIC X VALUE 'N'. 05 WS-ORDER-ITEMS-PRESENT PIC X VALUE 'N'. 05 WS-PAYMENT-INFO-PRESENT PIC X VALUE 'N'. 05 WS-DISCOUNT-INFO-PRESENT PIC X VALUE 'N'. 05 WS-SPECIAL-INSTR-PRESENT PIC X VALUE 'N'. 01 WS-VALIDATION-RULES. 05 WS-REQUIRED-ELEMENTS. 10 WS-REQ-ORDER-HEADER PIC X VALUE 'Y'. 10 WS-REQ-CUSTOMER-INFO PIC X VALUE 'Y'. 10 WS-REQ-ORDER-ITEMS PIC X VALUE 'Y'. 10 WS-REQ-PAYMENT-INFO PIC X VALUE 'Y'. 05 WS-OPTIONAL-ELEMENTS. 10 WS-OPT-BILLING-ADDR PIC X VALUE 'N'. 10 WS-OPT-SHIPPING-ADDR PIC X VALUE 'N'. 10 WS-OPT-DISCOUNT-INFO PIC X VALUE 'N'. 10 WS-OPT-SPECIAL-INSTR PIC X VALUE 'N'. 01 WS-PROCESSING-RESULTS. 05 WS-VALIDATION-STATUS PIC X VALUE 'P'. *> P=Pass, F=Fail 05 WS-MISSING-ELEMENTS PIC 9(2) VALUE 0. 05 WS-OPTIONAL-COUNT PIC 9(2) VALUE 0. 05 WS-TOTAL-ELEMENTS PIC 9(3) VALUE 0. 05 WS-PROCESSING-TIME PIC 9(4) VALUE 0. 01 WS-ERROR-TRACKING. 05 WS-VALIDATION-ERRORS OCCURS 20 TIMES. 10 WS-ERROR-TYPE PIC X(20). 10 WS-ERROR-ELEMENT PIC X(30). 10 WS-ERROR-MESSAGE PIC X(100). 05 WS-ERROR-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. ADVANCED-XML-PROCESSING. DISPLAY "=== ADVANCED XML PRESENT PROCESSING ===" PERFORM SETUP-COMPLEX-XML PERFORM VALIDATE-XML-STRUCTURE PERFORM PROCESS-CONDITIONAL-ELEMENTS PERFORM GENERATE-VALIDATION-REPORT DISPLAY "=== ADVANCED PROCESSING COMPLETE ===" SETUP-COMPLEX-XML. DISPLAY "Setting up complex order XML..." *> Create comprehensive order XML STRING '' '
' ' ' DELIMITED BY SIZE INTO WS-ORDER-XML END-STRING COMPUTE WS-ORDER-LENGTH = FUNCTION LENGTH(FUNCTION TRIM(WS-ORDER-XML)) DISPLAY "✅ Complex order XML prepared (" WS-ORDER-LENGTH " characters)" VALIDATE-XML-STRUCTURE. DISPLAY "Validating XML structure using PRESENT..." *> Initialize presence flags INITIALIZE WS-ORDER-STRUCTURE MOVE 0 TO WS-ELEMENT-DEPTH MOVE 0 TO WS-TOTAL-ELEMENTS *> Parse and validate structure XML PARSE WS-ORDER-XML THRU XML-STRUCTURE-END PROCESSING PROCEDURE HANDLE-STRUCTURE-EVENTS ON EXCEPTION DISPLAY "❌ XML structure validation failed" MOVE 'F' TO WS-VALIDATION-STATUS NOT ON EXCEPTION DISPLAY "✅ XML structure validation completed" END-XML XML-STRUCTURE-END. EXIT. HANDLE-STRUCTURE-EVENTS. EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' PERFORM TRACK-ELEMENT-PRESENCE ADD 1 TO WS-ELEMENT-DEPTH ADD 1 TO WS-TOTAL-ELEMENTS WHEN 'END-OF-ELEMENT' SUBTRACT 1 FROM WS-ELEMENT-DEPTH WHEN 'START-OF-DOCUMENT' DISPLAY "📄 Beginning structure validation" WHEN 'END-OF-DOCUMENT' DISPLAY "📄 Structure validation complete" PERFORM VALIDATE-REQUIRED-ELEMENTS END-EVALUATE TRACK-ELEMENT-PRESENCE. MOVE XML-TEXT TO WS-CURRENT-ELEMENT *> Track presence of key document sections EVALUATE WS-CURRENT-ELEMENT WHEN 'order-header' MOVE 'Y' TO WS-ORDER-HEADER-PRESENT DISPLAY "✅ Order header PRESENT" WHEN 'customer-info' MOVE 'Y' TO WS-CUSTOMER-INFO-PRESENT DISPLAY "✅ Customer info PRESENT" WHEN 'billing-address' MOVE 'Y' TO WS-BILLING-ADDR-PRESENT DISPLAY "✅ Billing address PRESENT" ADD 1 TO WS-OPTIONAL-COUNT WHEN 'shipping-address' MOVE 'Y' TO WS-SHIPPING-ADDR-PRESENT DISPLAY "✅ Shipping address PRESENT" ADD 1 TO WS-OPTIONAL-COUNT WHEN 'order-items' MOVE 'Y' TO WS-ORDER-ITEMS-PRESENT DISPLAY "✅ Order items PRESENT" WHEN 'payment-info' MOVE 'Y' TO WS-PAYMENT-INFO-PRESENT DISPLAY "✅ Payment info PRESENT" WHEN 'discount-info' MOVE 'Y' TO WS-DISCOUNT-INFO-PRESENT DISPLAY "✅ Discount info PRESENT" ADD 1 TO WS-OPTIONAL-COUNT WHEN 'special-instructions' MOVE 'Y' TO WS-SPECIAL-INSTR-PRESENT DISPLAY "✅ Special instructions PRESENT" ADD 1 TO WS-OPTIONAL-COUNT END-EVALUATE VALIDATE-REQUIRED-ELEMENTS. DISPLAY " " DISPLAY "Validating required elements..." MOVE 0 TO WS-MISSING-ELEMENTS *> Check each required element IF WS-ORDER-HEADER-PRESENT NOT = 'Y' PERFORM LOG-VALIDATION-ERROR WITH "MISSING_REQUIRED" "order-header" "Required order header missing" ADD 1 TO WS-MISSING-ELEMENTS END-IF IF WS-CUSTOMER-INFO-PRESENT NOT = 'Y' PERFORM LOG-VALIDATION-ERROR WITH "MISSING_REQUIRED" "customer-info" "Required customer info missing" ADD 1 TO WS-MISSING-ELEMENTS END-IF IF WS-ORDER-ITEMS-PRESENT NOT = 'Y' PERFORM LOG-VALIDATION-ERROR WITH "MISSING_REQUIRED" "order-items" "Required order items missing" ADD 1 TO WS-MISSING-ELEMENTS END-IF IF WS-PAYMENT-INFO-PRESENT NOT = 'Y' PERFORM LOG-VALIDATION-ERROR WITH "MISSING_REQUIRED" "payment-info" "Required payment info missing" ADD 1 TO WS-MISSING-ELEMENTS END-IF *> Set overall validation status IF WS-MISSING-ELEMENTS = 0 MOVE 'P' TO WS-VALIDATION-STATUS DISPLAY "✅ All required elements present" ELSE MOVE 'F' TO WS-VALIDATION-STATUS DISPLAY "❌ " WS-MISSING-ELEMENTS " required elements missing" END-IF PROCESS-CONDITIONAL-ELEMENTS. DISPLAY " " DISPLAY "Processing conditional elements..." *> Process billing address if present IF WS-BILLING-ADDR-PRESENT = 'Y' DISPLAY "📍 Processing billing address information" PERFORM PROCESS-BILLING-ADDRESS ELSE DISPLAY "⚠️ Billing address not present - using default" END-IF *> Process shipping address if present IF WS-SHIPPING-ADDR-PRESENT = 'Y' DISPLAY "🚚 Processing shipping address information" PERFORM PROCESS-SHIPPING-ADDRESS ELSE DISPLAY "⚠️ Shipping address not present - using billing address" END-IF *> Process discount if present IF WS-DISCOUNT-INFO-PRESENT = 'Y' DISPLAY "💰 Processing discount information" PERFORM PROCESS-DISCOUNT-INFO ELSE DISPLAY "ℹ️ No discount information present" END-IF *> Process special instructions if present IF WS-SPECIAL-INSTR-PRESENT = 'Y' DISPLAY "📝 Processing special instructions" PERFORM PROCESS-SPECIAL-INSTRUCTIONS ELSE DISPLAY "ℹ️ No special instructions present" END-IF PROCESS-BILLING-ADDRESS. DISPLAY " Processing billing address details..." PROCESS-SHIPPING-ADDRESS. DISPLAY " Processing shipping address details..." PROCESS-DISCOUNT-INFO. DISPLAY " Applying discount calculations..." PROCESS-SPECIAL-INSTRUCTIONS. DISPLAY " Processing special handling instructions..." LOG-VALIDATION-ERROR. USING ERROR-TYPE-PARM ERROR-ELEMENT-PARM ERROR-MESSAGE-PARM. ADD 1 TO WS-ERROR-COUNT MOVE ERROR-TYPE-PARM TO WS-ERROR-TYPE(WS-ERROR-COUNT) MOVE ERROR-ELEMENT-PARM TO WS-ERROR-ELEMENT(WS-ERROR-COUNT) MOVE ERROR-MESSAGE-PARM TO WS-ERROR-MESSAGE(WS-ERROR-COUNT) GENERATE-VALIDATION-REPORT. DISPLAY " " DISPLAY "=== XML VALIDATION REPORT ===" DISPLAY "Document Structure Analysis:" DISPLAY " Total elements processed: " WS-TOTAL-ELEMENTS DISPLAY " Validation status: " WS-VALIDATION-STATUS DISPLAY " Missing required elements: " WS-MISSING-ELEMENTS DISPLAY " Optional elements present: " WS-OPTIONAL-COUNT DISPLAY " " DISPLAY "Element Presence Summary:" DISPLAY " Order Header: " WS-ORDER-HEADER-PRESENT DISPLAY " Customer Info: " WS-CUSTOMER-INFO-PRESENT DISPLAY " Billing Address: " WS-BILLING-ADDR-PRESENT DISPLAY " Shipping Address: " WS-SHIPPING-ADDR-PRESENT DISPLAY " Order Items: " WS-ORDER-ITEMS-PRESENT DISPLAY " Payment Info: " WS-PAYMENT-INFO-PRESENT DISPLAY " Discount Info: " WS-DISCOUNT-INFO-PRESENT DISPLAY " Special Instructions: " WS-SPECIAL-INSTR-PRESENT *> Display validation errors if any IF WS-ERROR-COUNT > 0 DISPLAY " " DISPLAY "Validation Errors:" PERFORM VARYING ERROR-INDEX FROM 1 BY 1 UNTIL ERROR-INDEX > WS-ERROR-COUNT DISPLAY " " ERROR-INDEX ": " WS-ERROR-TYPE(ERROR-INDEX) DISPLAY " Element: " WS-ERROR-ELEMENT(ERROR-INDEX) DISPLAY " Message: " WS-ERROR-MESSAGE(ERROR-INDEX) END-PERFORM ELSE DISPLAY " " DISPLAY "✅ No validation errors detected" END-IF *> Calculate completeness score COMPUTE WS-COMPLETENESS-SCORE = ((4 - WS-MISSING-ELEMENTS) / 4) * 100 DISPLAY " " DISPLAY "📊 Document Completeness: " WS-COMPLETENESS-SCORE "%" IF WS-COMPLETENESS-SCORE = 100 DISPLAY "🌟 Perfect document structure" ELSE IF WS-COMPLETENESS-SCORE >= 75 DISPLAY "✅ Good document structure" ELSE DISPLAY "⚠️ Document structure needs attention" END-IF END-IF' ' ' 'ORD-2023-001 ' '2023-12-01 ' 'PENDING ' '' ' ' 'CUST-12345 ' 'ABC Corporation ' 'John Doe ' '' ' ' '456 Business Ave ' 'Chicago ' 'IL ' '60601 ' '' ' ' '789 Warehouse Blvd ' 'Milwaukee ' 'WI ' '53201 ' '' ' ' '- ' '
' 'PROD-ABC-123 ' '5 ' '29.99 ' '- ' '
' 'PROD-XYZ-789 ' '2 ' '149.99 ' '' ' ' 'CREDIT_CARD ' 'VISA ' '****-****-****-1234 ' '' ' ' 'SAVE10 ' '44.98 ' '