Project

General

Profile

XML

Introduction

FWD provides complete support for 4GL eXtensible Markup Language constructs.

DOM - Document Object Model

The below 4GL snippet shows some X-DOCUMENT DOM capabilities:

create x-document h.
create x-noderef hr.
create x-noderef h1.
create x-noderef h2.

h:create-node(hr, "lvl1", "element").
h:append-child(hr).

h:create-node(h1, "lvl2", "element").
hr:append-child(h1).

h1:set-attribute("fwd", "true").

h:create-node(h2, "", "cdata-section").
h2:node-value = "This is some text".
h1:append-child(h2).

h:save("file", "a.xml").

And the pertinent converted Java:

         XmlFactory.createXDocument(h);
         XmlFactory.createXNodeReference(hr);
         XmlFactory.createXNodeReference(h1);
         XmlFactory.createXNodeReference(h2);
         h.unwrapXDocument().createNode(hr, "lvl1", "element");
         h.unwrapXEntity().appendChild(hr);
         h.unwrapXDocument().createNode(h1, "lvl2", "element");
         hr.unwrapXEntity().appendChild(h1);
         h1.unwrapXNodeRef().setAttribute("fwd", "true");
         h.unwrapXDocument().createNode(h2, "", "cdata-section");
         h2.unwrapXNodeRef().setNodeValue(new character("This is some text"));
         h1.unwrapXEntity().appendChild(h2);         

         h.unwrapXDocument().save("file", "a.xml");

SAX

A simple SAX-reader sample:

procedure StartElement:
    define input parameter namespaceURI as character.
    define input parameter localName as character.
    define input parameter qname as character.
    define input parameter attributes as HANDLE.

   def var c as char.
   c = attributes:get-value-by-qname("value").
   if c <> "testing" then message "Unexpected error 1" c.

   c = attributes:get-value-by-qname("S1:parent").
   if c <> "http://www.mywebsite.com/a.html" then message "Unexpected error 2" c.

   c = attributes:get-value-by-qname("s1:parent").
   if c <> ? then message "Unexpected error 3" c.

   c = attributes:get-value-by-qname("parent").
   if c <> ? then message "Unexpected error 4" c.

   c = attributes:get-value-by-qname("xmlns:parent").
   if c <> ? then message "Unexpected error 5" c.

   c = attributes:get-value-by-qname("xmlns:url").
   if c <> ? then message "Unexpected error 6" c.

   c = attributes:get-value-by-qname("url").
   if c <> ? then message "Unexpected error 7" c.

   def var ni as integer.
   ni = attributes:num-items.
   def var i as int.
   def var ln  as char.
   def var qn as char.
   def var type as char.
   def var uri as char.
   def var val as char.

   do i = 1 to ni:
      ln = attributes:get-localname-by-index(i).
      qn = attributes:get-QNAME-by-index(i).
      type = attributes:get-TYPE-by-index(i).
      uri = attributes:get-URI-by-index(i).
      val = attributes:get-VALUE-by-index(i).

      if i = 1 then do:
         if ln <> "parent" then message "failed ln" i ln qn type uri val.
         if qn <> "S1:parent" then message "failed qn" i ln qn type uri val.
         if type <> "CDATA" then message "failed type" i ln qn type uri val.
         if uri <> "urn:soap-fault:details" then message "failed uri" i ln qn type uri val.
         if val <> "http://www.mywebsite.com/a.html" then message "failed val" i ln qn type uri val.

         if attributes:get-index-by-qname(qn) <> i then message "failed g1" i ln qn type uri val.
         if attributes:get-value-by-qname(qn) <> val then message "failed g2" i ln qn type uri val.
         if attributes:get-type-by-qname(qn) <> type then message "failed g3" i ln qn type uri val.
      end.
      else if i = 2 then do:
         if ln <> "value" then message "failed ln" i ln qn type uri val.
         if qn <> "value" then message "failed qn" i ln qn type uri val.
         if type <> "CDATA" then message "failed type" i ln qn type uri val.
         if uri <> "" then message "failed uri" i ln qn type uri val.
         if val <> "testing" then message "failed val" i ln qn type uri val.

         if attributes:get-index-by-qname(qn) <> i then message "failed g1" i ln qn type uri val.
         if attributes:get-value-by-qname(qn) <> val then message "failed g2" i ln qn type uri val.
         if attributes:get-type-by-qname(qn) <> type then message "failed g3" i ln qn type uri val.
      end.
      else do:
         message "unexpected" i ln qn type uri val.
      end.
   end.

end procedure.

def var saxReader as handle.
def var hHandle as handle.

create sax-reader saxReader. 
saxReader:handler = this-procedure.
def var lc1 as longchar.
lc1 = "<fwd xmlns='http://www.mywebsite.com/default' xmlns:S1='urn:soap-fault:details' S1:parent='http://www.mywebsite.com/a.html' value='testing' xmlns:url='http://www.mywebsite.com/b.html'>this is just a test</fwd>".

saxReader:set-input-source("longchar", lc1).
saxReader:suppress-namespace-processing = false.
saxReader:sax-parse().

The converted Java pertinent parts:

   /**
    * External procedure (converted to Java from the 4GL source code
    * in xml/sax/simple_sax_test.p).
    */
   @LegacySignature(type = Type.MAIN, name = "xml/sax/simple_sax_test.p")
   public void execute()
   {
      externalProcedure(SimpleSaxTest.this, new Block((Body) () -> 
      {
         XmlFactory.createSaxReader(saxReader);
         saxReader.unwrapSaxReader().setHandler(thisProcedure());
         lc1.assign(new character("<fwd xmlns='http://www.mywebsite.com/default' xmlns:S1='urn:soap-fault:details' S1:parent='http://www.mywebsite.com/a.html' value='testing' xmlns:url='http://www.mywebsite.com/b.html'>this is just a test</fwd>"));
         saxReader.unwrapSaxReader().setInputSource("longchar", lc1);
         saxReader.unwrapXmlSchema().setSuppressNamespaceProcessing(new logical(false));
         saxReader.unwrapSaxReader().saxParse();
      }));
   }
.
.
.
   public void startElement(final character _namespaceUri, final character _localName, final character _qname, final handle _attributes)
   {
      character namespaceUri = UndoableFactory.initInput(_namespaceUri);
      character localName = UndoableFactory.initInput(_localName);
      character qname = UndoableFactory.initInput(_qname);
      handle attributes = UndoableFactory.initInput(_attributes);
      character c = UndoableFactory.character();
      integer ni = UndoableFactory.integer();
      integer i = UndoableFactory.integer();
      character ln = UndoableFactory.character();
      character qn = UndoableFactory.character();
      character type = UndoableFactory.character();
      character uri = UndoableFactory.character();
      character val = UndoableFactory.character();

      internalProcedure(new Block((Body) () -> 
      {
         c.assign(attributes.unwrapSaxAttributes().getValueByQname("value"));

         if (_isNotEqual(c, "testing"))
         {
            message(new Object[]
            {
               "Unexpected error 1",
               c
            });
         }

         c.assign(attributes.unwrapSaxAttributes().getValueByQname("S1:parent"));
.
.
.


© 2004-2022 Golden Code Development Corporation. ALL RIGHTS RESERVED.