本文对PBDOM技术进行相关介绍,但并不涉及XML的基础知识,建议阅读者对下述相关术语有必定了解: Document(文档), DTD(文档类型定义), schema(大纲),Element(元素), attribute(属性), processing instruction(处理命令), entity(实体)。编程
本文主要包括如下内容:
一、为何要使用PBDOM以及怎样建立PBDOM
二、PBDOM主要用于那些地方
三、如何使用PBDOM编程
四、PBDOM和其余XML解析(parser)技术的比较数组
1、什么是DOM数据结构
◆文档对象模型(Document Object Model)
一、做为一项W3C规范,XML DOM存在目的是为不一样类型的应用程序提供一个标准的编程接口,它被设计能够跨平台、跨语言使用。
二、咱们能够利用XML DOM建立XML文档并操纵其结构,增长、修改、删除元素。
三、程序中调用XML解析器载入XML文档到内存中。当文档被载入后,能够经过进入DOM检索和操做相关信息。
四、DOM 保存了XML文档树,文档(document)元素位于整棵树的最顶层。该元素能够有一到多个子节点来保存树的结构。app
能够参阅如下网站: http://www.w3schools.com/dom/ 来了解更多的关于XML Document Object Model的内容。less
2、何时应该使用DOM工具dom
◆当你须要作下列事情的时候,你应该想到XML DOM的ide
一、在一个或者多个XML文档之间移动元素
二、建立新的元素而且在XML文档的任意位置插入
三、操做元素并从新插入其到XML文档其余位置
四、导入内嵌数据结构
& . pb9中,数据窗口如今能够经过XML导出内嵌数据结构(nested data structures).函数
3、什么是PBDOM工具
◆PowerBuilder 文档结构模型(PowerBuilder Document Object Model)oop
一、PBDOM是经过PBNI扩展出来的,用于操做XML数据,并针对PowerScript做了优化
二、在程序中模型是经过DOM的抽象来表示XML数据。(A programming model to represent XML data –an abstraction of DOM)
三、底层是对Apache Xerces/C++的封装。
4、PBDOM的设计目标
一、简单易用(Be straightforward for PowerBuilder programmers)
二、能够利用PowerScript的强大语言能力(如对象、方法重载、数据等)
三、在可能的状况下,隐藏了XML底层的复杂实现(Hide the complexities of XML wherever possible)
四、原有的DOM在pb下使用不够直观(DOM is unintuitive to a PowerBuilder programmer)
5、使用PBDOM初步
◆PBDOM设置
一、添加pbdom90.pbd(%SYBASE%\Shared\PowerBuilder)到工程的pbl列表中
二、%SYBASE%\Shared\PowerBuilder应该在系统路径或者应用程序的路径中(也就是pbdom要使用此路径下的pbdom90.dll, pbxerces90.dll、xerces_2_1_0.dll文件,一样,当程序发布时候也须要)
6、PBDOM类的使用
◆如图所示,反映了PBDOM类的组成和继承关系,能够看到,几乎全部的PBDOM类都继承自PBDOM_Object(除了PBDOM_Builder和PBDOM_Exception)
一、PBDOM_Document
◆构建PBDOM举例
1.1 直接构建(XML documents can be created from scratch)
PBDOM_Document doc
PBDOM_Element rootdoc = CREATE PBDOM_Document
root = CREATE PBDOM_Element
root.SetName( "root" )
root.SetText( "this is the root" )
doc.AddContent( root )
1.2 从文件、字符串、DataStore中载入
PBDOM_Builder builder
doc = builder.BuildFromString( "<foo>bar</foo>" )
doc = builder.BuildFromFile( "c:\foo\bar.xml"
doc = builder.BuildFromDataStore( l_ds)
二、PBDOM_Element2.1 遍历元素
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!) 即:
◆ 修改数组中的元素,一样会做用到父文档
◆ 返回的数组是有界的(Once the array is returned, it is now bounded)
◆ 在数组中增长新元素时,须要一个SetContent()方法调用
2.2 移动元素
// PBDOM_Document docOne,docTwo
PBDOM_Element movable
movable = CREATE PBDOM_Element
Movable.SetName( "movable" )
docOne.AddContent( movable ) // add
movable.Detach() // remove
docTwo.addContent( movable ) // add again
注意:
一、只要是从PBDOM_Object继承的对象,均可以调用Detach()方法(如Comments、ProcessingInstructions、Elements (and their content)等等)
二、PBDOM元素对象不是永久的捆绑在它的父文档上的(PBDOM elements aren't permanently tied to their parent document)
2.3 符合规格(Always well-formed)
PBDOM_Element构造器以及setter方法会检查元素是否符合规格:
elem.SetName( "Spaces are illegal" )
AddContent()方法也会从如下几个方面进行检查:
◆ 结构---树中没有循环(Structure –no loops in any tree)
◆ 只有一个根节点元素(One and only one root element)
◆ 相容的命名空间(Consistent namespaces)
三、PBDOM_Attribute
3.1 操做元素属性
◆ 元素能够有多个属性
<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
四、PBDOM_Text4.1 操做元素文本内容
<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" )
五、PBDOM_Object5.1 操做有混合内容的元素
<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
六、PBDOM_ProcessingInstruction6.1 使用处理命令(Processing instructions)
<? xml-stylesheet type="text/xsl"href="foo.xsl" _fcksavedurl=""foo.xsl"" ?>
{------target------} {----------------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
七、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 ls_element
PBDOM_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")
7、PBDOM vs. the Competition
◆Apache Xerces/COM
Xerces 是如今PBDOM底层使用的XML解析器,但对PowerBuiler用户来讲使用不直观。(Xerces is the [current] underlying XML parser for PBDOM, but is less intuitive)
◆MSXML
.没法在UNIX等操做系统上使用(No deployment to UNIX possible)
.一样对PowerBuiler用户来讲使用不够直观(Less Intuitive)
.COM collections vs. PB arrays (pb用户固然会优先选择使用数组来处理数据),
◆Others
Expat–a C DLL (使用时须要声明外部函数…使用不够普遍)
最后,特殊声明:
若是编译后遇到运行时错误以下提示:
"Error calling method of a PBNI Object."
以下图所示:
请按以下方法进行处理:
在应用中声明全部 PBNI 对象!不然编译时可能不会将必要的对象打包进 exe 文件。好比我正在使用 pb_dom,那么我在应用中便须要明确地引用全部 PBNI 对象:
PBDOM_ATTRIBUTE l_PBDOM_ATTRIBUTE
PBDOM_BUILDER l_PBDOM_BUILDER
PBDOM_CDATA l_PBDOM_CDATA
PBDOM_CHARACTERDATA l_PBDOM_CHARACTERDATA
PBDOM_COMMENT l_PBDOM_COMMENT
PBDOM_DOCTYPE l_PBDOM_DOCTYPE
PBDOM_DOCUMENT l_PBDOM_DOCUMENT
PBDOM_ELEMENT l_PBDOM_ELEMENT
PBDOM_ENTITYREFERENCE l_PBDOM_ENTITYREFERENCE
PBDOM_EXCEPTION l_PBDOM_EXCEPTION
PBDOM_OBJECT l_PBDOM_OBJECT
PBDOM_PROCESSINGINSTRUCTION l_PBDOM_PROCESSINGINSTRUCTION
PBDOM_TEXT l_PBDOM_TEXT
以上变量能够定义在application对象的全局变量里,这里的变量能够不使用。这样,PB打包的时候,就会将全部对象打包到exe里。
估计是PB的一个BUG吧。