可扩展标记语言(XML)(PPT-135).ppt_第1页
可扩展标记语言(XML)(PPT-135).ppt_第2页
可扩展标记语言(XML)(PPT-135).ppt_第3页
可扩展标记语言(XML)(PPT-135).ppt_第4页
可扩展标记语言(XML)(PPT-135).ppt_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二十章 可扩展标记语言(XML),本章的学习内容包括六个方面: 1 学会使用 XML 标记数据。 2 理解 XML 命名空间的概念。 3 理解 DTD、架构和 XML 的关系。 4 学会创建架构。 5 学会创建和使用简单的 XSLT 文档。 6 学会使用使用 XslTransform 类将 XML 文档转换成 XHTML。,20.1 概述 可扩展标记语言(Extensuble Markup Language, XML)于 1996 年由万维网协会(W3C)下属的 “XML 工作组” 开发的。XML 是 可移植的、获得普遍支持的开放(非专利性)技术,可以用于 对数据进行描述。 XML 正在快速成为程序的数据交换标准。使用 XML,文档作 者可描述任何类型数据,包括数学公式、软件配置指南、乐谱、 菜谱以及财务报表。无论人或机器,都能方便阅读 XML 文档。 .NET Framework 广泛运用了 XML。Framework 类库(FCL)提供 了和 XML 有关的一系列类。Visual C+ .NET 的许多内部实现也利 用了 XML。Visual C+ .NET 还配备了一个 XML 编译器和校验器。,20.2 XML 文档 本节将通过两个简单的 XML 文档,介绍 XML 文档的组成。第 一个 XML 文档描述了一篇文章。注意,为了叙述方便,我们下 面的 XML 文档增加了行号(行号不是 XML 文档的内容)。 1 2 3 4 5 6 7 8 Simle XML 9 10 August 6, 2003 11,9 10 August 6, 2003 11 12 13 Su 14 Fari 15 16 17 XML is pretty easy. 18 19 In this chapter, we present a wide variety of examples 20 that use XML. 21 ,22 23 分析该 XML 文档是由以下几部分组成的: 1 文档的第1行是一个可选的 “XML 声明”,它将该文档标识成一 个 XML 文档。虽然 XML 声明是可选的,但最好保留;如果不 能确切地遵循正确的 XML 版本,会导致不可预测的错误。 2 注解行是以 结尾的,几乎可以放在文挡的任 何地方。例如: 3 使用 “标记”(Tag)来标记数据。标记名称要封闭在一对尖括 号。标记必须成对使用,以便对字符数据进行定界。例如: Simle XML。,注意,结束标记与起始标记的区别仅在于,在字符 之后有一个正斜杠字符。例如文档中的 和 等。 4 独立的标记单元(即包括在起始标记和结束标记之间的一切内容)成为 “元素”。XML 文档总体上只由一个元素构成,即 “根元素”,其中包含了文档中的其他所有元素。根元素必须是 XML 声明之后的第一个元素。例如,本例的 aticle 。 不同元素可以嵌套,从而形成一个层次结构 根元素位于 层次结构的最顶部。这样能使文档的作者在数据之间明确建 立关系。例如,title, date, author, summary 和 content 元素都嵌 套在 article 内。而 firstName 和 lastName 都嵌套在 author 内。,注意,在 XML 文档中创建多个根元素是语法错误。另外, XML 要区分大小写。切记不要将元素名的大小写弄混。 为了处理 XML 文档,需要一个 “XML 解析器”。该解析器负责 检查 XML 文档的语法,并使 XML 文档的数据能由应用程序使用。 流行的解析器包括微软的 MSXML、Apache 软件基金会的 Xerces 以及 IBM 的 XML4J 等等。本章使用的是 MSXML 。 在 IE 中打开 XML 文档后,MSXML 会解析文档,并将解析过 的数据传送给 IE。然后,IE 使用一个内建的 “样式表” 格式化数 据。注意下图中的最终数据格式与 XML 文档的原始格式非常相 似。正如后面要展示的,为了将 XML 数据转换成合适显示的格 式,样式表充当了至关重要的角色。,下面展示的是第二个 XML 文档,它标记了一封商务信函。该 文档包含了比上一个 XML 文档更多的数据。 1 2 3 4 5 6 7 8 Jane Doe 9 Box 12345 10 15 Any Ave.,11 Othertown 12 Otherstate 13 67890 14 555-4321 15 16 17 18 19 John Doe 20 123 Main St. 21 22 Anytown 23 Anystate,24 12345 25 555-1234 26 27 28 29 Dear Sir: 30 31 It is our privilege to inform you about our new 32 database managed with XML. This 33 new system allows you to reduce the load on 34 you inventory list server by having the client machine 35 perform the work of sorting and filtering the data. 36 ,37 38 Please visit our Web site for availablity 39 and pricing. 40 41 42 Sincerely 43 44 Ms. Doe 45 根元素 letter(第 645 行)包含子元素 contact(第 716 行和 第 1827 行)、salutation(第 29 行)、paragraph(第 3136 行和 第 3840 行)、closing(第 42 行)以及 signature(第 44 行)。,数据除了能放到标记之间,还可以放到 “属性”(attributes)中。 所谓属性是指起始标记中的 “名称-值” 对(名称和值用一个等号 “=” 来分隔)。每个元素都可在其起始标记中指定任意数量的属 性。第一个 contact 元素指定了 type 属性,属性值是 “from”,表 明该 contact 元素标记了与发信人有关的信息。第二个 contact 元 素也指定了 type 属性,属性值是 “to”,表明该 contact 元素标记 了与收信人有关的信息。和标记名一样,属性名也要区分大小 写;可为任意长度;可采用字母、数字、下划线、连字号和句 号;但必须以字母或下划线字符开头。salutation 元素标记了信 函问候语。paragraph 元素标记了信函正文。closing 和 signature 元素则分别标记了信函作者的结语和签名。,注意,属性值必须用双引号(“”)或单引号()来封闭,否则 就是语法错误。不能为一个元素指定两个同名属性。 本文档的第 15 行引入了名为 flag 的一个 “空元素”,它指出联 系人的性别。所谓空元素是指不包含字符数据(也就是说,起 始和结束标记之间没有文本)的元素。要结束这样的元素,要 么在元素末尾插入一个正斜杠,如本文的 ; 要么显式写一个结束标记,例如:。 注意,第 21 行的 address2 元素也不包含数据。所以可以将第 21 行安全地修改成 。然而,完全省略元素可能不是明 智之举,因为某些 DTD(文档类型定义)或者架构需要用到它。 这些问题的详细内容将在后面的有关节中讨论。,20.3 XML 命名空间 与 .NET Framework 的结构相似,XML 也使用了 “命名空间” 对 XML 元素进行区分。此外,对于一些基于 XML 的语言(称为“词 汇表”),比如, XML 架构语言和可扩展样式表语言等,它们也 常常用命名空间来标识自己的元素。 元素根据 “命名空间前缀” 来区分,它标识一个元素从属于哪 个命名空间。例如: Visual C+ .NET 用命名空间前缀 deitel 来限定 book 元素,表明 book 元素是 deitel 空间的一部分。除了保留的命名空间前缀 xml 之外,文档作者 可将任何名称作为命名空间前缀使用。,注意,以任何大小写组合形式创建名为 xml 的命名空间前缀都 是语法错误。 下面的 XML 文档中包含了两个 file 元素,它们通过命名空间 加以区分。 1 2 3 4 5 6 8,9 10 A book list 11 12 13 14 A funny picture 15 16 17 18 ,注意,属性无需用命名空间前缀加以限定,因为它们肯定与元 素联系在一起。 第 67 行用 xmlns 属性创建了两个命名空间前缀 text 和 image。 每个命名空间前缀都和一系列字符绑定,这些字符构成了 “统一 资源标识符”(URI)。URI 惟一性地标识了命名空间。文档作者 可创建自己的命名空间及 URI。注意,我们是在创建前缀的同一 行上使用 text 命名空间前缀。为了确保命名空间的唯一性,作 者必须提供不重复的 URI。本例将 urn:deitel:textInfo 和 urn:deitel: imageInfo 作为 URI 使用。一种常见的做法是将 URL 作为 URI 使 用。因为 URL 中的域名()肯定是不重复的。例 如,第 67 行可以改写成:,6 这个例子使用了与 Deitel & Associates 公司域名对应的 URL 来标 识命名空间。XML 解析器其实永远不会访问这些 URL 它们 只是一系列以示区别的字符。这些 URL 不需要引用实际的网 页,甚至不需要具有正确的形式。 第 911 行用命名空间前缀 text 来限定元素 file 和 description, 表示它们从属于 “urn:deitel:textInfo” 命名空间。注意,命名空间前 缀也要应用于结束标记。第 1316 行将命名空间前缀 text 应用 于 file、description 和 size 元素。 要想避免为每个标记名都附加命名空间前缀,作者可以指定 一个 “默认命名空间”。下面的文档演示了默认命名空间。,1 2 3 4 5 6 8 9 10 A book list 11 12 13 ,14 A funny picture 15 16 17 18 默认命名空间应用于 directory 元素以及没有使用命名空间前 缀限定的所有元素。但是,也可使用一个命名空间前缀,为特 定元素指定一个不同的命名空间。例如,第 13 行为 file 元素附 加了 image 前缀,表明它在 urn:deitel:imageInfo 命名空间中而不是 在默认命名空间中。,20.4 文档对象模型 虽然 XML 文档是文本文件,但通过顺序文件访问技术从中获 取数据,显得既不实际,效率也不够好,尤其是在需要动态添 加或删除数据的时候。 一个 XML 文档被成功解析后,解析器会将文档数据按照树结 构存储到内存中。下面我们以 article.xml 文档为例讨论文档的树 结构。这个层次化的树结构称为 “文档对象模型”(Document Object Model, )树,能够创建这类结构的 XML 解析器被称之为 “DOM 解析器”。,DOM 树将 XML 文档的每个组件(比如 article,date,firstName 等等)表示成树上的一个节点。包含了其他节点的一个节点( 如 author)称为 “父节点”。具有同一父的节点(比如 firstName 和 lastName)称为 “同辈节点”(Sibling Node)。 节点的 “后辈节点”(Descendant Node)包括:节点的子节点、 子节点的子节点类似地, 节点的 “前辈节点”(Ancestor Node)包括:节点的父节点、父 节点的父节点 每个 DOM 树都只有一个 “根节点”,它包含了其他所有节点、 比如注解和元素。,用于创建、读取和操纵 XML 文档的类型定义在 System:Xml 命 域空间中。该空间还包含其他命域空间,提供了与 XML 文档有 关的其他类。 article.xml 文档的 DOM 树如下所示: 接下来,本节要展示使用 DOM 树的几个程序实例。,article,title,date,author,summary,content,firstName,lastName,实例1 XmlReaderTest 加载了本章第一个 XML 文档 article.xml, 并在一个文本框中按照 DOM 树层次结构显示其中的数据。 在该实例中通过创建 XML 文档类型 XmlDocument 的对象,并 调用 XmlDocument 类型的方法 Load 将 article.xml 加载到对象中, 以便程序读取和处理该 XML 文档的数据。 读取 XmlDocument 类型对象所加载的数据是由 XmlNodeReader 类型(抽象类型 XmlReader 的派生类)对象通过 Read 方法完成 的。 本程序只对读取的数据进行类型(元素、注解还是文本)判 断。用于判断的数据类型依据是由枚举类型 XmlNodeType 提供 的。上述的类型和枚举同属于 System:Xml 命域空间中。,为了显示 XmlDocument 类型对象中加载的 XML 文档数据,需 要在程序的主窗体中添加一个文本框 TextBox 控件。程序的 GUI 设计如下:,编程要点 1 由于程序中需要使用 XmlDocument、XmlNodeReader 类型和枚举类型 XmlNodeType ,因此程序中需要 添加使用这些类型所在的命域空间的语句: using namespace System:Xml; 2 在主窗体 Form1 类型中添加一个方法 PrintXml,实现按树形结 构显示指定 XML 文件中信息的设计需求。代码如下: void PrintXml() / create and load XML document XmlDocument document = gcnew XmlDocument(); document-Load( L“article.xml“);,/ create XmlNodeReader for document XmlNodeReader reader = gcnew XmlNodeReader( document ); / show form before outputTextBox is populated this-Show(); / tree depth is -1, no indentation int depth = -1; / display each nodes content while( reader-Read() ) switch( reader-NodeType ) / if Element, display its name case XmlNodeType:Element:,/ increase tab depth depth+; TabOutput( depth ); outputTextBox-AppendText( String:Concat( L“Name, L“rn“ ); / if empty element, decrease depth if( reader-IsEmptyElement ) depth-; break; / if Comment, display it case XmlNodeType:Comment: TabOutput( depth );,outputTextBox-AppendText( String:Concat( L“Value, L“rn“ ); break; / if Text, display it case XmlNodeType:Text: TabOutput( depth ); outputTextBox-AppendText( String:Concat( L“t“, reader-Value, L“rn“ ); break; / if XML declaration, display it case XmlNodeType:XmlDeclaration: TabOutput( depth );,outputTextBox-AppendText( String:Concat( L“Name, L“ “, reader-Value, L“ ?rn“ ); break; / if EndElement, display it and decrement depth case XmlNodeType:EndElement: TabOutput( depth ); outputTextBox-AppendText( String:Concat( L“Name, L“rn“ ); depth-; break; / end switch / end while / end method PrintXml,其中辅助方法 TabOutput 用于在输出的文本中加入 Tab 转移字 符,以便表示文本信息的层次关系。代码如下: void TabOutput( int number ) for( int i = 0; i AppendText( L“t“ ); / end method TabOutput 3 在 Form1 的构造函数中添加调用 PrintXml 方法的语句: Form1( void ) InitializeComponent(); PrintXml(); ,4 添加主窗体大小变化事件的处理方法 Form1_SizeChanged,以便在主窗体大小发生变化时,文本框控件的大小依据主窗体的大小发生相应的变化。代码如下: System:Void Form1_SizeChanged( System:Object sender, System:EventArgs e) outputTextBox-Size = this-Size; ,实例的运行结果如下:,实例2 XmlDOM 演示了如何通过程序来操纵 DOM 树。该程序 首先将 XML 文件 letter.xml 加载到一个 XmlDocument 类型对象 中,然后依据 XML 数据的 DOM 树层次结构,将 XmlDocument 类 型对象中的数据复制到另一个 XmlDocument 类型对象中,并在 复制操作的同时创建一个树形视图显示中数据的树形结构关系。 程序还允许将复制得到的 XmlDocument 类型对象中的数据以非 树形结构格式的文本显示,同时将这些数据写到一个新建的 XML 文件中。 程序的 GUI 设计如下:,其中添加的三个按钮(Button)控件、一个树形视图(TreeView) 控件和一个文本框控件(TextBox)的用途如下:,编程要点 1 由于程序中需要使用 XmlDocument、XmlNodeReader、XmlNode、 XmlNodeWriter、 TempFileCollection 类型和枚举 XmlNodeType , 因此程序中需要添加使用这些类型所在的命域空间的语句: using namespace System:Xml; using namespace System:CodeDom:Compiler; 2 在主窗体 Form1 中除了需要添加与界面控件关联的控件类型 对象外,还需要添加相关的数据成员: 用于装载 XML 源文件的 XmlDocument 类型数据成员: private: XmlDocument source 。, 用于保存 XML 目标文件的 XmlDocument 类型数据成员: private: XmlDocument copy 。 用于构造树形视图节点的 TreeNode 类型数据成员: private: TreeNode copy 。 3 在 Form1 的构造函数中添加初始化数据成员的代码: Form1( void ) InitializeComponent(); / create XmlDocument and load letter.xml source = gcnew XmlDocument(); source-Load( L“letter.xml“ ); / initialize pointer to 0,copy = nullptr; tree = nullptr; 4 单击 Build 按钮事件的处理方法 buildButton_Click 。代码如下: System:Void buildButton_Click( System:Object sender, System:EventArgs e) / determine if copy has been built already if( copy != nullptr ) return; / document already exists / instantiate XmlDocument and TreeNode copy = gcnew XmlDocument(); tree = gcnew TreeNode();,/ add root node name to TreeNode and add TreeNode to / TreeView control tree-Text = source-Name; / assign #root xmlTreeView-Nodes-Add( tree ); / build node and tree hierarchy BuildTree( source, copy, tree ); printButton-Enabled = true; resetButton-Enabled = true; / end method buildButton_Click 其中调用的辅助方法 BuildTree 用于复制 XML 数据和显示数据 创建树形视图。代码如下: void BuildTree( XmlNode xmlSourceNode, XmlNode document, TreeNode treeNode ), / create XmlNodeReader to access XML document XmlNodeReader nodeReader = gcnew XmlNodeReader( xmlSourceNode ); / represents current node in DOM tree XmlNode currentNode = nullptr; / treeNode to add to existing tree TreeNode newNode = gcnew TreeNode(); / points to modified node type for createNode XmlNodeType modifiedNodeType; while( nodeReader-Read() ) / get current node type,modifiedNodeType = nodeReader-NodeType; / check for EndElement, store as Element if( modifiedNodeType = XmlNodeType:EndElement ) modifiedNodeType = XmlNodeType:Element; / create node copy currentNode = copy-CreateNode( modifiedNodeType, nodeReader-Name, nodeReader-NamespaceURI ); / build tree based on node type switch( nodeReader-NodeType ) / if Text node, add its value to tree case XmlNodeType:Text: newNode-Text = nodeReader-Value;,treeNode-Nodes-Add( newNode ); / append Text node value to currentNode data dynamic_cast( currentNode )- AppendData( nodeReader-Value ); document-AppendChild( currentNode ); break; / if EndElement, move up tree case XmlNodeType:EndElement: document = document-ParentNode; treeNode = treeNode-Parent; break; / if new element, add name and traverse tree case XmlNodeType:Element:,/ determine if element contains content if( !nodeReader-IsEmptyElement ) / assign node text, add newNode as child newNode-Text = nodeReader-Name; treeNode-Nodes-Add( newNode ); / set treeNode to last child treeNode = newNode; document-AppendChild( currentNode ); document = document-LastChild; / end if / do not traverse empty elements else, / assign NodeType string to newNode newNode-Text = (System:Object) nodeReader-NodeType)-ToString(); treeNode-Nodes-Add( newNode ); document-AppendChild( currentNode ); / end else break; / all other types, display node type default: newNode-Text = (System:Object) nodeReader-NodeType)-ToString();,treeNode-Nodes-Add( newNode ); document-AppendChild( currentNode ); break; / end switch newNode = gcnew TreeNode(); / end while / update the TreeView control xmlTreeView-ExpandAll(); xmlTreeView-Refresh(); / end method BuildTree,5 单击 Print 按钮事件的处理方法 printButton_Click 。代码如下: System:Void printButton_Click( System:Object sender, System:EventArgs e) / exit if copy does not point to an XmlDocument if( copy = nullptr ) return; / create temporary XML file TempFileCollection file = gcnew TempFileCollection(); / create file that is deleted at program termination String filename = file-AddExtension( L“xml“, false ); / write XML data to disk,XmlTextWriter writer = gcnew XmlTextWriter( filename, System:Text:Encoding:UTF8 ); copy-WriteTo( writer ); writer-Close(); / parse and load temporary XML document XmlTextReader reader = gcnew XmlTextReader( filename ); / read, format and display data while( reader-Read() ) if( reader-NodeType = XmlNodeType:EndElement ) consoleTextBox-AppendText( L“/“ );,if( reader-Name != String:Empty ) consoleTextBox-AppendText( String:Concat( reader-Name, L“rn“ ); if( reader-Value != String:Empty ) consoleTextBox-AppendText( String:Concat( reader-Value, L“rn“ ); / end while reader-Close(); / end method printButton_Click,6 单击 Reset 按钮事件的处理方法 resetButton_Click。代码如下: System:Void resetButton_Click( System:Object sender, System:EventArgs e) / remove TreeView nodes if( tree != nullptr ) xmlTreeView-Nodes-Remove( tree ); xmlTreeView-Refresh(); / force TreeView update / delete XmlDocument and tree copy = nullptr; tree = nullptr; consoleTextBox-Text = L“; / clear text box,printButton-Enabled = false; resetButton-Enabled = false; / end method resetButton_Click,程序的执行结果如下:,单击 Build 按钮后,程序的执行状态:,单击 Print 按钮后,程序的执行状态:,虽然 XmlNodeReader 类的基类 XmlReader 包含了读取和修改节 点值的方法,但在 DOM 树中定位数据时,它并不是最有效的方 式。 System:Xml:XPath 命名空间中提供的 XPathNavigator 类能遍 历符合搜索条件的节点列表。搜索条件是一个 “XPath 表达式”。 XPath 提供了一种语言( XML Path Language, XML 路径语言), 能在 XML 文档中快速、高效地定位特定节点。XPath 是一种基 于字符串的表达式语言,供 XML 及其许多相关技术使用。 实例3 PathNavigator 演示了如何使用 XPathNavigator 在 XML 文 档中导航。与实例2 一样,程序使用了一个 TreeView 控件和多 个 TreeNode 对象来显示 XML 文档结构。两实例的不同之处为: 本例在树形视图只显示与当前导航状态相关的部分 DOM 树。,XPathNavigator 每次定位到一个新节点时,都会更新 TreeNode 节点列表,并依据更新后的节点列表,在 TreeView 控件中添加 或删除节点,以反映 XPathNavigator 在 DOM 树中的当前位置。 本例中使用的 XML 文档 sports.xml 如下所示: 1 2 3 4 5 6 7 8 ,9 Cricket 10 11 12 More popular among Commonwealth nations. 13 14 15 16 17 Baseball 18 19 20 More popular in America.,21 22 23 24 25 Soccer (Football) Most popular sport in the world 29 30 为了便于使用者使用导航功能浏览 XML 文本数据,本例 中,主窗体的 GUI 设计如下:,其中所添加的控件的用途,按照从上至下的顺序列在下表中:,注意,表中用于选择 DOM 树中指定节点的定位描述的组合下拉 表框(ComboBox)控件 selectComboBox 中表项的添加方法: 静态初始化 如果表项的数量和内容可以预先确定,则一般在添加该控件时,通过初始化 Items 属性,将表项文本添加到组合下拉表框 中。本例中就是将可以预先确定的的 7 条表项: sports sportsgame sportsgamename sportsgameparagraph sportsgamename=Cricket sportsgamename=Baseball,sportsgamename=Soccer (Football) 通过静态添加到组合下拉表框中的。操作方法如下图所示:, 动态添加 组合下拉表框(ComboBox)类型还提供了添加表项的方法: 首先通过 ComboBox 类型对象的属性 Item 获取存放表项的集合 ComboBox.ObjectCollection 类型对象; 然后,便可以调用 ComboBox.ObjectCollection 类提供的方法: int Add( Object item ); 向组合下拉表框添加参数指定的表项。 void Add( array items ); 向组合下拉表框添加参数指定的多个表项。 void Clear(); 清除组合下拉表框中的所有表项。,编程要点 1 由于程序中需要使用 XPathDocument、XPathNavigator 等类型, 因此程序中需要添加使用这些类型所在的命域空间的语句: using namespace System:Xml; using namespace System:Xml:XPath; 2 在主窗体 Form1 中除了需要添加与界面控件关联的控件类型 对象外,还需要添加相关的数据成员: 用于装载 XML 文件的 XPathDocument 类型数据成员: private: XPathDocument document 。 用于导航浏览 document 中的 XML 数据的 XPathNavigator 类 型数据成员:,private: XPathNavigator xpath 。 用于构造树形视图的 TreeNode 类型数据成员: private: TreeNode tree 。 3 在 Form1 的构造函数中添加初始化数据成员的代码: Form1( void ) InitializeComponent(); / load in XML document document = gcnew XPathDocument( L“sports.xml“ ); / create navigator xpath = document-CreateNavigator(); / create root node for TreeNodes,tree = gcnew TreeNode(); tree-Text = (System:Object)xpath-NodeType)-ToString(); / #root pathTreeViewer-Nodes-Add( tree ); / update TreeView control pathTreeViewer-ExpandAll(); pathTreeViewer-Refresh(); pathTreeViewer-SelectedNode = tree; / highlight root 4 单击 First Child、Parant、Next 或 Previous 按钮的事件处理方法 用于在 document 装载的 XML 文件数据中,使用 xpath 进行四 种不同的导航浏览。这四个事件处理方法的代码如下:,System:Void firstChildButton_Click( System:Object sender, System:EventArgs e) TreeNode newTreeNode; / move to first child if( xpath-MoveToFirstChild() ) newTreeNode = gcnew TreeNode(); / create new node / set nodes Text property to either navigators name or value DetermineType( newTreeNode, xpath ); / add node to TreeNode node list tree-Nodes-Add( newTreeNode ); tree = newTreeNode; / assign tree newTreeNode,/ update TreeView control pathTreeViewer-ExpandAll(); pathTreeViewer-Refresh(); pathTreeViewer-SelectedNode = tree; / end if / end method firstChildButton_Click 其中被调用的辅助方法 DetermineType 将根据浏览器 xpath 当前的节点类型,确定树形视图的节点类型。代码如下: void DetermineType( TreeNode node, XPathNavigator xPath ) / if Element, get its name if( xPath-NodeType = XPathNodeType:Element ) ,/ get current node name, remove white space node-Text = xPath-Name-Trim(); / end if else / get current node value, remove white space node-Text = xPath-Value-Trim(); / end else / end method DetermineType System:Void parentButton_Click( System:Object sender, System:EventArgs e) ,/ move to parent if( xpath-MoveToParent() ) tree = tree-Parent; / get number of child nodes, not including subtree int count = tree-GetNodeCount( false ); / remove all children tree-Nodes-Clear(); / end if else / if node has no paraent (root node) MessageBox:Show( L“Current node has no parent.“, L“, MessageBoxButtons:OK, MessageBoxIcon:Information ); / end method parentButton_Click,System:Void nextButton_Click( System:Object sender, System:EventArgs e) TreeNode newTreeNode = nullptr, newNode = nullptr; / move to next sibling if( xpath-MoveToNext() ) newTreeNode = tree-Parent; / get parent node newNode = gcnew TreeNode(); / create new node DetermineType( newNode, xpath ); newTreeNode-Nodes-Add( newNode ); / set current position for display tree = newNode;,/ update TreeView control pathTreeViewer-ExpandAll(); pathTreeViewer-Refresh(); pathTreeViewer-SelectedNode = tree; / end if else / node has no additional siblings MessageBox:Show( L“Current node is last sibling.“, L“, MessageBoxButtons:OK, MessageBoxIcon:Information ); / end method nextButton_Click System:Void previousButton_Click(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论