PowerBuilder Easy XML with PowerBuilder Document Object Model
PowerBuilder Easy XML with PBDOM
Terry Voth
www.techno-kitten.com Moderator TeamSybase Liaison Director International Sybase User Group
PowerBuilder Easy XML with PBDOM
John Strano
Presenter Sybase Technical Evangelist
Learn Objectives
This session provides a technical introduction to PBDOM This session is not an introduction to XML Terms you should be comfortable with:
Document, DTD, schema Element, attribute, processing instruction, entity
This presentation will teach you... Why (and how) PBDOM was created Where PBDOM is most useful How to program with PBDOM How PBDOM compares to other XML parsing technologies
PowerBuilder: Easy XML with PBDOM
What is DOM?
Document Object Model As a W3C specification, the objective for the XML DOM has been to provide a standard programming interface to a wide variety of applications. The XML DOM is designed to be used with any programming language and any operating system. With the XML DOM, a programmer can create an XML document, navigate its structure, and add, modify, or delete its elements.
PowerBuilder: Easy XML with PBDOM
What is DOM?
Document Object Model A program called an XML parser can be used to load an XML document into the memory of your computer. When the document is loaded, its information can be retrieved and manipulated by accessing the DOM. The DOM represents a tree view of the XML document. The documentElement is the top-level of the tree. This element has one or many childNodes that represent the branches of the tree.
PowerBuilder: Easy XML with PBDOM
What is DOM?
For more on XML Document Object Model http://www.w3schools.com/dom/
PowerBuilder: Easy XML with PBDOM
When should I use a DOM Tool?
When you need to Move elements of the document within the document or to an entirely different document. Create new elements and introduce them at any point within the document Manipulate elements of the document and then re-insert them into the document. Import nested structures. The XML capabilities of the DataWindow that were introduced in PowerBuilder 9 can currently only export nested data structures.
PowerBuilder: Easy XML with PBDOM
What is PBDOM? Whats In A Name
PowerBuilder Document Object Model PBDOM is a PBNI extension for XML data manipulations, optimized for PowerScript A programming model to represent XML data an abstraction of DOM Uses Apache Xerces/C++ under the hood
PowerBuilder: Easy XML with PBDOM
East XML with PBDOM: PBDOM Design Goals
PBDOM was created to... Be straightforward for PowerBuilder programmers Use the power of the PowerScript language (objects, method overloading, arrays) Hide the complexities of XML wherever possible DOM is unintuitive to a PowerBuilder programmer (anyone ever used DOM in PowerDynamo?)
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: Getting Started with PBDOM
Setup Just add pbdom90.pbd to (%SYBASE%\Shared\PowerBuilder) your library list %SYBASE%\Shared\PowerBuilder should be on your PATH or AppPath registry entry (for pbdom90.dll, pbxerces90.dll and xerces_2_1_0.dll)
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: The Big Picture
PBDOM Class Hierarchy All PBDOM classes (except PBDOM_Builder and PBDOM_Exception) inherit from PBDOM_Object
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Document
Construction
XML documents can be created from scratch
PBDOM_Document doc PBDOM_Element root doc = CREATE PBDOM_Document root = CREATE PBDOM_Element root.SetName( "root" ) root.SetText( "this is the root" ) doc.AddContent( root )
DataStore
XML File
PBDOM Document
Or built from a file, a string or a datastore
PBDOM_Builder builder doc = builder.BuildFromString( "<foo>bar</foo>" ) doc = builder.BuildFromFile( "c:\foo\bar.xml" ) doc = builder.BuildFromDataStore( l_ds )
DOM Nodes
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Element
Navigating the element tree
PBDOM_Element root, children[], first // Get the root element of the document root = doc.GetRootElement() // Get an array of all child elements root.GetChildElements( children ) // Get only elements with a given name root.GetChildElements( "name", children ) // Get the first element with a given name first = root.GetChildElement( "name" )
The element array is live!
Changes to the elements affects the parent document Once the array is returned, it is now bounded Adding new elements to the array requires a SetContent() call PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Element
Moving elements is easy with PBDOM
// PBDOM_Document docOne, docTwo PBDOM_Element movable movable = CREATE PBDOM_Element Movable.SetName( "movable" ) docOne.AddContent( movable ) movable.Detach() docTwo.addContent( movable )
// add // remove // add again
Detach() may be called for anything that is derived from PBDOM_Object
Comments ProcessingInstructions Elements (and their content) Etc
PBDOM elements aren't permanently tied to their parent document
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Element
Always well-formed The PBDOM_Element constructor and setter methods check the element for well-formedness
elem.SetName( "Spaces are illegal" )
The AddContent() method also checks for:
Structure no loops in any tree One and only one root element Consistent namespaces
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Attribute
Elements may have attributes <table width="100%" border="0"></table>
// Get an attribute ls_width = table.GetAttributeValue( "width" ) // or ls_width = table.GetAttribute ( "width" ).GetText() // Attributes can be typed li_border = table.GetAttribute( "width" ).GetIntValue() // Set an attribute table.SetAttribute( "cellspacing", "0" ) // Remove an attribute table.RemoveAttribute( "cellspacing" ) // Remove all attributes PBDOM_Attribute empty[] table.SetAttributes( empty ) // the PowerScript way
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Text
Elements may have content <description> cool demo </description>
// the text is directly available returns // "~r~ncool demo~r~n" ls_desc = elem.GetText() // two convenience methods ls_desc = elem.GetTextTrim() // returns "cool demo" ls_desc = elem.GetTextNormalize() // returns "cool demo" // text can be changed directly elem.SetText( "a new description" )
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_Object
Elements may have mixed content <description> <! comment --> <?convert units="metric" ?> cool demo </description>
PBDOM_Object content[] desc.GetContent( content ) FOR i = 1 TO UpperBound( content ) CHOOSE content[i].GetObjectClassString() CASE "pbdom_comment" // ... CASE "pbdom_processinginstruction" // ... END CHOOSE NEXT
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM_ProcessingInstruction
Processing instructions look like this
<? xml-stylesheet
Target
type="text/xsl" href="foo.xsl" ?>
Data
// Get target (e.g., "xsl-stylesheet") ls_target = pi.GetTarget() // Get data (e.g., 'type="text/xsl" href="foo.xsl"') ls_data = pi.GetText() // Get individual values as attributes String names[] pi.GetNames( names ) FOR i = 1 TO UpperBound( names ) MessageBox( names[i], pi.GetValue( names[i] ) NEXT
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM and Namespaces
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="ffsection" select="//SITE_SECTION <xsl:template name="TopNav"> ... </xsl:template> </xsl:stylesheet> String PBDOM_Element ls_element template
// get element name and namespace return xsl:template template = root.GetChildElement( "template" ) ls_element= template.GetNamespacePrefix() +: + template.Getname() // get element by name and namespace template = root.GetChildElement( template, xsl, & http://www.w3.org/1999/XSL/Transform
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: Demonstration
Demo Code Example
PowerBuilder: Easy XML with PBDOM
Easy XML with PBDOM: PBDOM vs. the Competition
Apache Xerces/COM
Xerces is the [current] underlying XML parser for PBDOM, but is less intuitive
MSXML
No deployment to UNIX possible Less Intuitive COM collections vs. PB arrays (if youre a casual COM user)
Others
Expat a C DLL (requires external function declarationsunwieldy)
PowerBuilder: Easy XML with PBDOM
PB9Books.com
Advanced Client/Server
Internet & Distributed Development
PowerBuilder: Easy XML with PBDOM
SDN Presents CodeXchange: A new benefit for Developers
Forum for exchanging samples, tools, scripts, etc.
Download samples created by Sybase or by external users Leverage contributions of others to extend Sybase products
Features enable community collaboration
Contribute code or start your own collaborative / open source project with input from other product experts
Any SDN member can participate
Log in using your MySybase account via SDN http://codexchange.sybase.com Or via SDN at www.sybase.com/developer
PowerBuilder: Easy XML with PBDOM
Questions & Answers
Q&A
PowerBuilder: Easy XML with PBDOM