热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XML先容系列(10)

系列之十八:如何应用XSL和正则表达式来验证数据的有效性(二)现在持续我在上一系列中先容的例子。我们将实现一个简略的搜索机制,也许你的爱好不是在获取书籍的标题而是在要获
系列之十八:如何应用XSL和正则表达式来验证数据的有效性(二)
现在持续我在上一系列中先容的例子。我们将实现一个简略的搜索机制,
也许你的爱好不是在获取书籍的标题而是在要获得全部书节点(note)上。
那么应用下面这个函数就能够满足你的请求了
Public Function GetFilteredElements(activeElement As Variant, RegExpfilter As String, _
Optional queryString As String = '',optional IsGlobal as Boolean=True, _
optional IgnoreCase as Boolean = True) As IXMLDOMNodeList
Dim re As RegExp
Dim filterDoc As DOMDocument
Dim nodelist As IXMLDOMNodeList
Dim filterList As IXMLDOMNodeList
Dim node As IXMLDOMElement
Dim baseNode As IXMLDOMElement
Set re = New RegExp
On Error GoTo ErrorHandler
Select Case TypeName(activeElement)
Case 'IXMLDOMElement'
Set baseNode = activeElement
Case 'DOMDocument'
Set baseNode = activeElement.documentElement
Case Else
Error 1001
Set GetFilteredElements = Nothing
End Select
re.Pattern = RegExpfilter
re.Global=IsGlobal
re.IgnoreCase=IgnoreCase
If queryString = '' Then
Set filterList = baseNode.selectNodes('.[textnode()]|.//*[textnode()]')
Else
Set filterList = baseNode.selectNodes(queryString)
End If
For Each node In filterList
If re.Test(node.Text) Then
node.setAttribute 'filter:filteredElementFound', 'true'
End If
Next
Set filterList = baseNode.selectNodes('.[@filter:filteredElementFound]|.//*[@filter:filteredElementFound]')
For Each node In filterList
node.removeAttribute 'filter:filteredElementFound'
Next
Set GetFilteredElements = filterList
Exit Function
ErrorHandler:
If Err.Number = 1001 Then
MsgBox 'Document must be an XML document, or a document element.'
Else
Error Err.Number
End If
End Function

下面是对这个方法的简略描写:
GetFilteredElements重要是用来获取一个XML的文档或则一个文档里面的节点,并且
按照我们的需要转换它(包含所有的该节点的子节点),将转换后的节点放到一个
列表类型IXMLDOMNodeList中.
这个过滤器程序按次序对每个节点进行应用,假如一个节点的文本满足了表达式的话,
那么这个节点就被做上一个临时属性的标记为filter:filteredElementFound
(当然为了不和你自己的XML文档里已经存在的标记产生冲突,你可以把这个属性
改成你需要的东西).
一旦所有的节点都被检查完毕后,一个新的列表对象(仅仅只包含那些满足表达式的
节点)被创立了。这些临时的属性会被删除掉,然后返回那些节点。

假如你没有给这个函数输进查询参数的话,
那么将获得全部文档的所有叶子节点(就是那些没有子元素的节点)
假如你给这个函数输进查询参数的话,
那么这个函数将返回满足条件的节点或则子节点
例如,下面的代码将返回第一本书的标题和描写的节点和第四本书的
描写节点
Dim bookXML=new DOMDocument
bookXML.load('bookCatalog.xml')
Set nodelist=GetfilteredElements(bookXML,'xml')
而下面的代码将返回第一和第四本书的节点,然后你可以根据这些节点获取它们的
子节点的属性。
Set nodelist=GetfilteredElements(bookXML,'xml','//book')
通常,你应当尽可能的定义一个XSL的查询过滤器(filter)
由于它会只返回你需要的节点,会大大减少你需要处理的数据量。

这个函数是XML '数据库'的一个应用实例,由于很多SQL的开发者用熟悉了的
参数(例如LIKE)在XML中是没有等效的方法的,但是只要你在XML中能够熟练应用
正则表达式,你会发明它能够实现很多LIKE语句能够实现的功效。

应用XSL转换验证数据
正则表达式应用在XSL的转换中是一个强有力的验证数占领效的工具。
例如,你想根据XML的数据天生一个显示书籍标题和描写的table
当你应用基于DOM版本(就是应用微软的那个模型XDOM)的时候,XSL已经能够实现非常复杂的转换XML为
HTML的功效了。
在XSL的这个节点中,答应你应用脚本语言。
你可以在输出流中插进文本(但是目前你就不能够把一个DOM节点输出到输出流中).
XSL中默认的脚本语言是Javascript,
在应用的过程中你需要留心的是,由于'/'在Javascript中是特别字符,你需要应用
'//'将其转意。
代码如下:

IsValidBookTopic=/xml/
]]>












当然,你也可以转变你的XSL中的查询参数(例如上面例子中应用的参数是xml)
一个直接的方法是天生一个参数实体'entities'
例如下面的代码,你需要应用'%'字符来阐明一个字符是参数。
Function SetXSLParameter(XslDoc as DOMDocument ,ParamName as _
String,ParamValue as Variant) as DOMDocument
Dim XslDoc as DOMDocument
Dim ScriptNode as IXMLDOMElement
Dim re as RegExp

Set re=new RegExp
Re.global=True
Re.IgnoreCase=True
Re.pattern='%' ParamName
For each ScriptNode in xslDoc.selectNodes('xsl:script')
ScriptNode.text=Re.replace(ScriptNode.text,cstr(ParamValue))
Next
Return XslDoc
End Function

SetXSLParameter用来给XSL文档设置参数。
当然你也可以不应用上面这个函数,直接在XSL的脚本里面修正这个参数,
但是假如你应用了上面这个函数的话,可以让你的代码的可扩大性能更好。
留心的是,XSL的代码将被上面这个函数所修正
所以假如你想对雷同的XSL对象应用不同的过滤器(就是不同的查询条件的话)
需要应用XSL对象的clone(就是制作一个XSL的副本)方法。
下面就是一个完整的例子

IsValidBookTopic=/%searchStr/
]]>













然后你就可以应用下面这段代码来修正这个参数了
呵呵,我是搞asp的,下面这段代码就是写在你的asp的程序中的。

Set xmlDoc=new DomDocument
Set xslDoc=new DOMDocument
XmlDoc.load 'catalog.xml'
XslDoc.load 'catalog.xsl'
SetXSLParameter xslDoc, 'searchStr', 'pair-o-dice'
Response.write xmlDoc.transformNode(xslDoc)

同样,应用上面的方法,你就可以设置其他的参数了,例如浏览器的类型呀
ASP的查询参数呀,或则一个基于Web的组件呀。

应用正则表达式给XSL带来了强盛的功效。
固然,应用这种通用性很强的方法在目前也许你不会看到能够给你带来很
大的上风(重要是很少有人写XML的程序的说),但是在未来的编程过程中,
你将会领会到它的强盛威力了。




推荐阅读
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
author-avatar
sen0226714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有