当前位置:首页 > > 充电吧
[导读]PBDOM操作XML文档轻松入门(Easy XML with PowerBuilder Document Object Model)(作者:Terry Voth、JohnStrano)  本文对PBD

PBDOM操作XML文档轻松入门(Easy XML with PowerBuilder Document Object Model)

(作者:Terry Voth、JohnStrano)


  本文对PBDOM技术进行相关介绍,但并不涉及XML的基础知识,建议阅读者对下述相关术语有一定了解:Document(文档), DTD(文档类型定义), schema(大纲),Element(元素), attribute(属性), processing instruction(处理命令), entity(实体)。

本文主要包括以下内容:
1、为什么要使用PBDOM以及怎样创建PBDOM
2、PBDOM主要用于那些地方
3、如何使用PBDOM编程
4、PBDOM和其他XML解析(parser)技术的比较

一、什么是DOM

 ◆文档对象模型(Document Object Model)
1、作为一项W3C规范,XML DOM存在目的是为不同类型的应用程序提供一个标准的编程接口,它被设计可以跨平台、跨语言使用。
2、我们可以利用XML DOM创建XML文档并操纵其结构,增加、修改、删除元素。
3、程序中调用XML解析器载入XML文档到内存中。当文档被载入后,可以通过进入DOM检索和操作相关信息。
4、DOM 保存了XML文档树,文档(document)元素位于整棵树的最顶层。该元素可以有一到多个子节点来保存树的结构。

可以参阅以下网站:http://www.w3schools.com/dom/ 来了解更多的关于XML Document Object Model的内容。

二、什么时候应该使用DOM工具

 ◆当你需要做下列事情的时候,你应该想到XML DOM的

1、在一个或者多个XML文档之间移动元素
2、创建新的元素并且在XML文档的任意位置插入
3、操作元素并重新插入其到XML文档其他位置
4、导入内嵌数据结构
  
   & . pb9中,数据窗口现在可以通过XML导出内嵌数据结构(nested data structures).

三、什么是PBDOM

 ◆PowerBuilder 文档结构模型(PowerBuilder Document Object Model)

1、PBDOM是通过PBNI扩展出来的,用于操作XML数据,并针对PowerScript作了优化
2、在程序中模型是通过DOM的抽象来表示XML数据。(A programming model to represent XML data –an abstraction of DOM)
3、底层是对Apache Xerces/C++的封装。

四、PBDOM的设计目标


1、简单易用(Be straightforward for PowerBuilder programmers)
2、可以利用PowerScript的强大语言能力(如对象、方法重载、数据等)
3、在可能的情况下,隐藏了XML底层的复杂实现(Hide the complexities of XML wherever possible)
4、原有的DOM在pb下使用不够直观(DOM is unintuitive to a PowerBuilder programmer)

五、使用PBDOM初步

 ◆PBDOM设置
1、添加pbdom90.pbd(%SYBASE%/Shared/PowerBuilder)到工程的pbl列表中
2、%SYBASE%/Shared/PowerBuilder应该在系统路径或者应用程序的路径中(也就是pbdom要使用此路径下的pbdom90.dll, pbxerces90.dll、xerces_2_1_0.dll文件,同样,当程序发布时候也需要)

六、PBDOM类的使用


 ◆如图所示,反映了PBDOM类的组成和继承关系,可以看到,几乎所有的PBDOM类都继承自PBDOM_Object(除了PBDOM_Builder和PBDOM_Exception)

1、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( "" )
doc = builder.BuildFromFile( "c:/foo/bar.xml"
doc = builder.BuildFromDataStore( l_ds)

 

2、PBDOM_Element 2.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


注意:

1、只要是从PBDOM_Object继承的对象,都可以调用Detach()方法(如Comments、ProcessingInstructions、Elements (and their content)等等)
2、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)

3、PBDOM_Attribute
3.1  操作元素属性

◆ 元素可以有多个属性


// 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

4、PBDOM_Text 4.1 操作元素文本内容

// 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" )

5、PBDOM_Object 5.1 操作有混合内容的元素

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

6、PBDOM_ProcessingInstruction 6.1 使用处理命令(Processing instructions)


// 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

7、PBDOM and 命名空间(Namespaces)

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")


七、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 (使用时需要声明外部函数…使用不够广泛)

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭