`
m635674608
  • 浏览: 5090685 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用 XPath-jQuery 集锦手册在 XPath 和 jQuery 之间做选择

    博客分类:
  • js
 
阅读更多

如果您正在 XML 应用程序中使用 XPath,但是却需要对 Web 应用程序使用 jQuery,那会怎么样呢?如果您知道 jQuery,却需要在应用程序中使用 XPath,又会如何呢?使用这个方便的集锦手册(phrase book),从知道的转向需要知道的。在本文中,学习使用 XPath 1.0 和 jQuery 1.4 处理类似的任务,让您能够在必要的时候从其中一个快速转向另一个。

Chris Herborth, 技术作家兼软件开发人员, Freelance

2010 年 4 月 19 日

  • +内容

简介

XML 是一种受到良好支持的 Internet 标准,使用它编码的结构化数据很容易被几乎任何编程语言解码,甚至能够被人类阅读或编写,只要他们使用标准文本编辑器即可。很多应用程序,尤其是现代的标准兼容的 Web 浏览器,都可以直接处理 XML 数据。

常用缩写词

  • Ajax:异步 JavaScript + XML
  • API:应用程序编程接口
  • DOM:文档对象模型
  • W3C:万维网联盟
  • XHTML:可扩展超文本标记语言
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

XPath(XML Path 语言)是一种强大的查询语言,用于选择 XML 文档中的节点。XPath 标准的 1.0 版本广泛实现于各种语言,比如 Java™、C# 和 JavaScript。

jQuery 是一种事实上标准的跨浏览器 JavaScript 库,用于选择和操纵 XHTML 文档(以及通过 Ajax 加载的 XML 文档)中的节点。它已经被很多大公司(包括 Google、IBM®、Microsoft® 和 Twitter)采用。在我写作本文时,发布了它的当前版本 1.4;所以我马上进行了升级,以利用它所承诺的更快速度。注意,本文中的 jQuery 例子应该未加修改地使用前一版本,即 jQuery 1.3.2。

 

为何在 XPath 存在于 JavaScript 中时使用 jQuery?

如果 XPath 是 W3C 标准,并且实现于 JavaScript 中,那么为什么还要麻烦地使用 jQuery 呢?

XPath 是一个普通的 XML 标准,而 jQuery 是一个轻量级的库,设计用于处理跨浏览器兼容性方面的问题,使您不必担心用户运行的是哪种浏览器。它足够灵活,可以在使用标准 JavaScript 词汇的浏览器 DOM 中工作,它还提供一些大大简化 Web 应用程序开发的附加特性,比如强大的 Ajax 和动画支持。

但是,应该总是对手边的工作使用适当的工具;更多地了解这两个工具无疑有助于您为下一个项目挑选适当的技术。

 

例子

整篇文章中,都会回过头来参考一个方便的样例 XML 文档,参见 清单 1。此书籍列表包括各种信息,比如作者、两种完全虚构的价格和书名。

清单 1. 样例 XML 文档 (book.xml)
<?xml version="1.0" encoding="utf-8"?>
<catalog>
    <book format="trade">
        <name>Jennifer Government</name>
        <author>Max Barry</author>
        <price curr="CAD">15.00</price>
        <price curr="USD">12.00</price>
    </book>

    <book format="textbook">
        <name>Unity Game Development Essentials</name>
        <author>Will Goldstone</author>
        <price curr="CAD">52.00</price>
        <price curr="USD">45.00</price>
    </book>

    <book format="textbook">
        <name>UNIX Visual QuickPro</name>
        <author>Chris Herborth</author>
        <price curr="CAD">15.00</price>
        <price curr="USD">10.00</price>
    </book>
</catalog>

注意,我跟这里列出的作者和发行人没有任何联系,只有最后那个明显的除外。价格完全是瞎编的,至于实际的定价,您应该询问自己喜欢的书店。

 

XPath 假定

对于本文中的 XPath 代码,您要做以下假定:

  • 已经将 book.xml 文件(参见 清单 1)加载到您的 XPath 实现可以使用的格式。
  • 从一个表示文档根的对象开始搜索。就是以 <catalog> 元素作为子元素的那个对象。您将称之为 root,因为它是 XML 文档层次结构的根。

由于在太多不同的平台上有太多的 XPath 实现,所以下面我们将重点放在 XPath 语句本身上,并使用一个类似于 JavaScript 的伪代码来在上下文中展示这些语句;请查看您喜欢的开发平台的类库,了解有关加载 XML 文档和您可用的特定 XML 节点对象的信息。

 

jQuery 假定

本文中的 jQuery 代码做以下假定:

  • 使用的是最新(版本 1.4.0)jQuery 代码(参见 参考资料 中的链接)。
  • 已经通过 jQuery.get() 或 jQuery.post() 方法加载了 book.xml 文件,并且已经将最终的 XML 文档存储在一个名为 root 的变量中(与 XPath 例子相同)。

用于做这件事的一些样例代码在 清单 2 中。

清单 2. 利用 jQuery 加载 XML 样例
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Book Catalog</title>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script type="text/javascript">// <![CDATA[
var root = null;

$(document).ready( function(){
    $.get( "http://localhost/~chrish/books.xml", 
        function( data ) {
            root = data;

            $("p#status").text( "Loaded." );
        } );
} );
// ]]></script>
</head>

<body>
<p id="status">
Loading book.xml...
</p>
</body>
</html>

在 $(document).ready() 函数中,使用 jQuery get() 方法从本地 Web 服务器加载 books.xml,将最终的文档对象存储在 root 变量中,并用status ID 设置段落的文本,以表明 XML 已完成加载。有关 jQuery 的更多信息,请查看本文末尾 参考资料 中的相关链接列表。

 

选择节点

XPath 和 jQuery 的基本目的都是从文档选择节点。一旦选择了一个节点(或一个节点集合),就可以找到您正在寻找的数据以及在需要时操纵文档。

XPath 设计用于确切返回您所寻找的节点;它一般非常特定。另一方面,jQuery 则使得操作大型节点集合非常容易,所以有时候您必须在开始处理节点之前小心地缩小匹配范围。

按名称选择节点

在搜索特定节点时,您通常知道它的名称,或者知道其父元素的名称。

要找到一个特定的元素,您会使用它的名称,如 清单 3 所示。

清单 3. 按名称选择节点
/* Find all <book> elements through XPath: */
var result = root.find( "//book" );

/* Find all <book> elements through jQuery: */
var result = $(root).find( "book" );

用于选择所有 <book> 元素的 XPath 语句(//book)使用两个斜杠 (//),来指定从当前节点(本例中是 root)开始、所有匹配的节点都会被找到。这是 jQuery 的默认行为,所以您不需要包含任何其他内容。在两种情况下,结果都是 清单 1 中的所有三个 <book> 元素。

通常可以通过指定元素路径来缩小搜索结果;结果将是自路径末尾的匹配节点(参见 清单 4)。

清单 4. 按路径选择节点—两者行为不同
/* Be more specific (XPath): */
var result = root.find( "/catalog//book" );

/* Be more specific (jQuery): */
var result = $(root).find( "catalog book" );

从根元素 (/) 开始,这个 XPath 语句将寻找第一个 <catalog> 元素,然后返回这第一个 <catalog> 元素下的所有 <book> 元素。jQuery 语句的行为稍有不同;它将返回所有 <catalog> 元素下的所有 <book> 元素(参见 清单 5)。对于例子 book.xml 文件,结果是相同的节点集,但是如果您想要得到 <book> 元素下的所有 <author> 元素,那会怎么样呢?跟 清单 3 中一样,应该以两个斜杠 (//) 开始 XPath 表达式。

清单 5. 按路径找出内含的节点—两个例子的行为一样
/* Get all authors from all books (XPath): */
var result = root.find( "//book//author" );

/* Get all authors from all books (jQuery): */
var result = $(root).find( "book author" );

要让 jQuery 跟 清单 4 中的 XPath 样例一样返回第一个 <catalog> 中的 <book> 元素,您必须指导它使用它找到的第一个 <catalog>(参见 清单 6)。

清单 6. 匹配第一个 catalog 中的 book—这些例子的行为一样
/* All books from the first catalog (XPath): */
var result = root.find( "/catalog//book" );

/* All books from the first catalog (jQuery): */
var result = $(root).find( "catalog:first book" );

找到元素的最后一次出现(比如项目列表中的最后一个列表项,或者选择列表中的最后一个选项)也是一个常见操作。要正确地将一些东西附加到列表末尾,需要知道此末尾的位置(参见 清单 7)。

清单 7. 找到 catalog 中的最后一个 book
/* The last book from the first catalog (XPath): */
var result = root.find( "/catalog/book[last()]" );

/* The last book from the first catalog (jQuery): */
var result = $(root).find( "catalog:first book:last" );

在两种情况下,您都得到第一个 <catalog> 元素中的最后一个 <book> 元素,这正是您在寻找的。在 XPath 例子中,last() 函数返回最后匹配元素的索引(用在方括号中)。

 

选择任意节点

有时,您不知道您在寻找的元素的名称,或者需要找到一个可能在几个不同元素中的元素。在 XPath 和 jQuery 中,都可以使用星号 (*) 来匹配任意元素(参见 清单 8)。

清单 8. any 元素
/* Find all authors in all elements inside of <catalog> (XPath): */
var result = root.find( "/catalog//*//author" );

/* Find all authors in all elements inside of <catalog> (jQuery): */
var result = $(root).find( "catalog:first * author" );

注意,我在 jQuery 样例中使用了 :first,以使它的行为完全跟 XPath 版本一样。

 

按属性选择节点

类似的元素通常具有独特的属性,比如 XHTML 元素中使用的 id 属性,是为了给 XHTML 元素一个惟一的引用 ID(参见 清单 9)。有时,您并不太关心特定的元素,而是关心一个属性为特定值的元素。

清单 9. 找到那些讨厌的教科书
/* Find all books that are textbooks (XPath): */
var result = root.find( "//book[@format='textbook']" );

/* Find all books that are textbooks (jQuery): */
var result = $(root).find( "book[format='textbook']" );

两个例子都将返回所有具有 format 属性且属性值设置为 textbook 的 <book> 元素(清单 1 中的 book.xml 文件中有两个这样的元素)。XPath 的语法使用一个 @ 符号来匹配属性(jQuery 只是将属性括在方括号中),您需要包含两个斜杠 (//) 来匹配所有 <book> 元素,但是两个查询非常类似,都很直观。

针对 XHTML 中两个最常见的匹配属性(id 和 class),jQuery 包含了两个快捷方式。在 XPath 中,您必须显式地写出它们(参见 清单 10)。

清单 10. 基于 id 和 class 属性匹配 XHTML
/* Find the "status" <p>, then the highlighted elements (XPath) */
var result1 = xhtml_root.find( "//p[@id='status']" );
var result2 = xhtml_root.find( "//*[@class='highlight']" );

/* Find the "status" <p>, then the highlighted elements (jQuery) */
var result1 = $( "p#status" );
var result2 = $( ".highlight" );

假设您的 XHTML 文档是有效的(确实是的,对吧?),ID 匹配查询将只返回一个元素,因为在有效的 XML 文档中,ID 必须是惟一的。

如果您是层叠样式表(Cascading Style Sheets,CSS)的粉丝,可能注意到了,jQuery 选择器几乎跟 CSS 选择器完全相同。这很方便,因为您只需要记住一个针对通过 jQuery 找到想要的元素和利用 CSS 为元素定义样式的标准。

多个选择器

XPath 和 jQuery 都允许您组合多个选择器来检索每个匹配任意查询的节点(就是说,将得到结果的并集)。在 XPath 中,用竖线 (|) 字符组合语句,而在 jQuery 中则使用逗号 (,)(参见 清单 11)。

清单 11. 找到多个选择器的结果
/* Find all book names and all authors (XPath) */
var result = root.find("//name|//author" );

/* Find all book names and all authors (jQuery) */
var result = $(root).find( "name,author" );

在两种情况下,结果都是文档任何地方所有 <name> 和 <author> 元素的列表。在 图 1 中,使用 AquaPath 查看 XPath 结果(AquaPath 是一个用于 Mac OS X Tiger 的工具,有关它的更多信息,请参见 参考资料)。

图 1. XPath 结果,book.xml 文件中所有 book 的 name 和 author 标记都已突出显示
XPath 结果的屏幕截图,book.xml 文件中所有 book 的 name 和 author 标记都已突出显示
 

遍历节点

除了选择节点之外,通常还需要遍历文档结构,以便找到相关的数据或者执行复杂的操作。XPath 和 jQuery 都可以帮助您遍历文档。

根据前面学习的内容,您可以使用这些遍历方法来帮助找到祖先(即包含当前元素的元素)或子孙(即当前元素包含的元素)。

例如,清单 12 用于找到包含您找到的最后一个 <book> 的 <catalog>。

清单 12. 哪个 catalog 列出最后一个 book?
/* Find the catalog for the last book you know about (XPath) */
var result = root.find( "//book[last()]/ancestor::catalog" );

/* Find the catalog for the last book you know about (jQuery) */
var result = $(root).find( "book:last" ).closest( "catalog" );

图 2 显示了结果。

图 2. 最后一个 book 的 catalog 祖先
突出显示的 catalog 标记的屏幕截图,该标记是 book.xml 中最后一个 book 的 catalog 祖先

有一件事要注意,jQuery closest() 方法的行为很像 XPath 的 ancestor-or-self;如果匹配的话,它将包含当前节点。在本例中它不包含当前节点,但是如果您可以嵌套名称相同的元素或者是在匹配属性,那么应该牢记这件事。

如果需要朝另一个方向走,找到嵌入在您已经找到的元素中的元素,也是可以做到的(参见 清单 13)。

清单 13. 找到列出在 catalog 中的 price
/* Find the prices of everything in the catalog. (XPath) */
var result = root.find( "//catalog/descendant::price" );

/* Find the prices of everything in the catalog. (jQuery) */
var result = $(root).find( "catalog price" );

对于那些特殊情况,即选择的节点可能匹配您正在寻找的元素,那么跟 XPath 中的祖先一样,子孙也具有 descendant-or-self(参见 图 3)。

图 3. 所有 price,已选中
突出显示的 price 标记的屏幕截图,这是 book.xml 中列出的 book 中的 price
 

模拟高级 XPath 特性

XPath 指定了很多在 jQuery 中不必要的有用特性;毕竟,jQuery 运行在浏览器中,可以充分利用 JavaScript 的优势,而 XPath 通常用于比较受限的环境中,比如 XSLT 处理。

当然,只要您想用,这并不能阻止您用 JavaScript 实现这些特性。

很容易数清查询结果的个数(参见 清单 14)。

清单 14. 多少节点匹配选择器?
/* How many price entries do you have? (XPath) */
var result = root.find( "count(//price)" );

/* How many price entries do you have? (jQuery) */
var result = $(root).find( "price" ).length;

有时只需要知道节点是否包含某个字符串(参见 清单 15)。

清单 15. 第三个 <author> 中包含 Chris 吗?
/* Does the third <author> have "Chris" in its contents? (XPath) */
var result = root.find( "contains(//book[3]/author,'Chris')" );

/* Does the third <author> have "Chris" in its contents? (jQuery) */
var result = $(root).find( "book:eq(2) author:contains('Chris')" ).length > 0

清单 15 中有一个非常重要的区别需要注意,XPath 的索引从 1 开始,不是从 0 开始。在 jQuery 中,必须使用 :eq(2) 来得到第三个结果。

XPath 也有一个 sum() 函数,它以匹配节点的内容作为参数,将这些参数转换成数值,并返回这些值的和。在使用 jQuery 时,必须编写一个简短的函数来模拟该函数(参见 清单 16)。

清单 16. 计算一些节点内容的和
/* Sum the Canadian prices (XPath) */
var result = root.find( "sum(//price[@curr='CAD'])" );

/* Sum the Canadian prices (jQuery) */
function sum( root, selector ) {
    var x = 0;
    $(root).find( selector ).map( function() {
        if( this.text ) {
            // Internet Explorer-only
            return x += ( this.text * 1 );
        }

        // Firefox and W3C-compliant browsers
        return x += ( this.textContent * 1 );
    } );
    return x;
}

var result = sum( root, "price[curr='CAD']" );

jQuery 中的 map() 方法为每个结果节点运行指定的函数。注意,要得到结果节点的内容,也必须稍微费点事。确保在所有您喜欢的浏览器上测试这类 JavaScript。

您现在应该比较能理解何时以及如何将 XPath 1.0 和 jQuery 1.4 用于类似的任务了。

 

结束语

对于从格式良好的 XML 文档(包括 XHTML 页面)选择节点,XPath 和 jQuery 具有强大的查询语义。尽管它们的语法不同,但是无论使用哪一个来基于元素名或属性值从文档选择重要的或感兴趣的节点,都相当容易。

对于匹配与当前匹配的元素相关的元素节点,XPath 和 jQuery 都支持直观的遍历语义。此外,由于 jQuery 运行在完全的 JavaScript 解释器中,所以您可以用少量的代码模拟 XPath 的一些高级特性。

 

https://www.ibm.com/developerworks/cn/xml/x-xpathjquery/

分享到:
评论

相关推荐

    IT各种功能和文档集锦

    【IT各种功能和文档集锦】是一个综合性的资源包,涵盖了三个主要的IT技术领域:jQuery、XML和AJAX。这些技术在现代Web开发中扮演着至关重要的角色,下面将分别详细阐述它们的重要知识点。 首先,jQuery是一个轻量级...

    网络爬虫源代码集锦

    8. **网页解析**:使用XPath和CSS选择器提取数据,以及处理JavaScript生成的内容。 9. **异常处理和日志记录**:确保爬虫在遇到问题时能够优雅地处理,并记录运行过程。 通过研究这些源代码,你可以了解网络爬虫的...

    软件工程第三章实验报告.docx

    软件工程第三章实验报告.docx

    第三章-第八节通信礼仪.ppt

    第三章-第八节通信礼仪.ppt

    智能家居股份合作协议.docx

    智能家居股份合作协议.docx

    西门子S7-1200 PLC双轴定位控制在电池焊接中的应用与优化

    内容概要:本文详细介绍了基于西门子S7-1200 PLC的双轴定位控制系统在电池焊接项目中的应用。主要内容涵盖双轴定位算法的设计与实现,包括使用SCL语言编写的运动控制函数块,以及梯形图用于处理IO互锁和焊接时序控制。文中还讨论了威纶通触摸屏的界面设计,如动态元素映射、宏指令的应用,以及电气图纸的安全回路设计。此外,文章分享了多个调试技巧和注意事项,如加速度参数设置、伺服驱动器订货号核对、BOM清单管理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和触摸屏界面设计的专业人士。 使用场景及目标:适用于需要深入了解PLC编程、运动控制算法、触摸屏界面设计及电气图纸绘制的工程项目。目标是提高双轴定位控制系统的精度和稳定性,确保电池焊接的质量和安全性。 其他说明:文中提供了完整的工程文件包下载链接,并强调了在实际应用中需要注意的具体事项,如硬件配置检查、参数调整等。

    Simulink与Carsim联合仿真:基于PID与MPC的自适应巡航控制系统设计与实现

    内容概要:本文详细介绍了如何利用Simulink和Carsim进行联合仿真,实现基于PID(比例-积分-微分)和MPC(模型预测控制)的自适应巡航控制系统。首先阐述了Carsim参数设置的关键步骤,特别是cpar文件的配置,包括车辆基本参数、悬架系统参数和转向系统参数的设定。接着展示了Matlab S函数的编写方法,分别针对PID控制和MPC控制提供了详细的代码示例。随后讨论了Simulink中车辆动力学模型的搭建,强调了模块间的正确连接和参数设置的重要性。最后探讨了远程指导的方式,帮助解决仿真过程中可能出现的问题。 适合人群:从事汽车自动驾驶领域的研究人员和技术人员,尤其是对Simulink和Carsim有一定了解并希望深入学习联合仿真的从业者。 使用场景及目标:适用于需要验证和优化自适应巡航控制、定速巡航及紧急避撞等功能的研究和开发项目。目标是提高车辆行驶的安全性和舒适性,确保控制算法的有效性和可靠性。 其他说明:文中不仅提供了理论知识,还有大量实用的代码示例和避坑指南,有助于读者快速上手并应用于实际工作中。此外,还提到了远程调试技巧,进一步提升了仿真的成功率。

    基于MATLAB/Simulink的变压器励磁涌流仿真模型构建与应用

    内容概要:本文深入探讨了利用MATLAB/Simulink搭建变压器励磁涌流仿真模型的方法和技术。首先介绍了空载合闸励磁涌流仿真模型的搭建步骤,包括选择和配置电源模块、变压器模块以及设置相关参数。文中详细讲解了如何通过代码生成交流电压信号和设置变压器的变比,同时强调了铁芯饱和特性和合闸角控制的重要性。此外,还讨论了电源简化模型的应用及其优势,如使用受控电压源替代复杂电源模块。为了更好地理解和分析仿真结果,文章提供了绘制励磁涌流曲线的具体方法,并展示了如何提取和分析涌流特征量,如谐波含量和谐波畸变率。最后,文章指出通过调整电源和变压器参数,可以实现针对不同应用场景的定制化仿真,从而为实际工程应用提供理论支持和技术指导。 适合人群:从事电力系统研究、变压器设计及相关领域的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解变压器励磁涌流特性的研究人员,旨在帮助他们掌握MATLAB/Simulink仿真工具的使用技巧,提高对励磁涌流现象的理解和预测能力,进而优化继电保护系统的设计。 其他说明:文中不仅提供了详细的建模步骤和代码示例,还分享了一些实用的经验和技巧,如考虑磁滞效应对涌流的影响、避免理想断路器带来的误差等。这些内容有助于读者在实践中获得更加准确可靠的仿真结果。

    三菱FX3U PLC与Factory IO通讯仿真PID液位调节程序:低成本高效学习PID控制

    内容概要:本文详细介绍了利用三菱FX3U PLC与Factory IO通讯仿真进行PID液位调节的方法,旨在降低学习PID控制的成本和难度。文中首先指出了传统硬件学习PID控制面临的高昂成本和复杂接线问题,随后介绍了仿真程序的优势,包括PID配置参数、调节参数、自整定和手动整定的学习方法。接着阐述了所需的设备和软件环境,以及具体的代码示例和寄存器配置。最后,通过实例展示了如何通过仿真环境进行PID参数调整和测试,验证了该方案的有效性和实用性。 适合人群:初学者和有一定PLC基础的技术人员,特别是那些希望通过低成本方式学习PID控制的人群。 使用场景及目标:适用于希望在不购买昂贵硬件的情况下,快速掌握PID控制原理和技术的应用场景。目标是通过仿真环境,熟悉PID参数配置和调整,最终能够应用于实际工业控制系统中。 其他说明:本文不仅提供了理论指导,还给出了详细的实践步骤和代码示例,使读者能够在实践中更好地理解和掌握PID控制技术。同时,强调了仿真环境与实际项目的相似性,便于知识迁移。

    智慧城市树木二维码智能管理系统概述.docx

    智慧城市树木二维码智能管理系统概述.docx

    .NET框架下基于Oracle数据库的大型MES生产制造管理系统源码解析与应用

    内容概要:本文详细介绍了基于.NET框架和Oracle数据库构建的大型MES(制造执行系统)生产制造管理系统的源码结构及其技术特点。该系统采用了BS架构,适用于Web端和WPF客户端,涵盖了从数据库设计、业务逻辑处理到前端展示等多个方面。文中不仅提供了具体的代码示例,还深入剖析了系统的技术难点,如Oracle数据库的高效连接方式、多线程处理、实时数据推送以及高级特性(如分区表、压缩技术和批量操作)的应用。此外,作者还分享了一些关于系统部署和维护的经验。 适合人群:主要面向拥有五年以上.NET开发经验的专业人士,特别是那些对Oracle数据库有一定了解并且参与过大中型项目开发的技术人员。 使用场景及目标:①帮助开发者深入了解MES系统的工作原理和技术实现;②为现有的MES系统提供优化思路;③作为学习资料,用于掌握.NET框架与Oracle数据库的最佳实践。 其他说明:尽管缺少完整的安装说明和数据库备份文件,但凭借丰富的代码片段和技术细节,这套源码仍然是一个宝贵的学习资源。同时,文中提到的一些技术点也可以应用于其他类型的工业控制系统或企业管理信息系统。

    lesson6_点阵.zip

    lesson6_点阵.zip

    jicmp(OpenNMS所需重要组件)

    ‌OpenNMS 依赖组件 jicmp 的完整解析与安装指南‌ ‌一、jicmp 的核心作用‌ ‌ICMP 协议支持‌ jicmp(Java Interface for ICMP)是 OpenNMS 实现网络设备可达性检测(如 Ping)的关键组件,通过原生代码高效处理 ICMP 报文,替代纯 Java 实现的性能瓶颈17。 ‌依赖版本要求‌:OpenNMS 33.1.5 需 jicmp >= 3.0.0,以支持 IPv6 及多线程优化7。 ‌与 jicmp6 的协同‌ jicmp6 是 jicmp 的扩展组件,专用于 IPv6 网络环境检测,二者共同构成 OpenNMS 网络监控的底层通信基础78。 ‌二、jicmp 安装问题的根源‌ ‌仓库版本不匹配‌ OpenNMS 官方旧版仓库(如 opennms-repo-stable-rhel6)仅提供 jicmp-2.0.5 及更早版本,无法满足新版 OpenNMS 的依赖需求78。 ‌典型错误‌:Available: jicmp-2.0.5-1.el6.i386,但 Requires: jicmp >= 3.0.07。 ‌手动编译未注册到包管理器‌ 手动编译的 jicmp 未生成 RPM 包,导致 yum 无法识别已安装的依赖,仍尝试从仓库拉取旧版本57。 ‌三、解决方案:正确安装 jicmp 3.0‌ ‌通过源码编译生成 RPM 包‌ bash Copy Code # 安装编译工具链 yum install -y rpm-build checkinstall gcc-c++ autoconf automake libtool # 编译并生成 jicmp-3.0.0 RPM wget https://sourceforge.net/projects/opennms/files/JICMP/stable-3.x/j

    机械CAD零件图.ppt

    机械CAD零件图.ppt

    制冷站智能群控管理系统的技术实现与优化

    内容概要:本文详细介绍了制冷站智能群控管理系统的构成及其核心技术实现。首先阐述了系统的四大组成部分:环境感知模块、数据处理模块、决策控制模块以及设备控制模块。接着通过具体的Python代码示例展示了如何利用MQTT协议进行设备间的通信,实现了温度控制等功能。此外,文中还探讨了数据处理中的噪声过滤方法、设备控制中的状态锁定机制、以及采用强化学习进行能效优化的具体案例。最后展望了未来的发展方向,如引入能量管理和AI集成等。 适合人群:从事制冷站自动化控制领域的工程师和技术人员,尤其是对智能群控管理系统感兴趣的从业者。 使用场景及目标:适用于希望提升制冷站自动化水平的企业和个人。目标在于提高系统的稳定性和效率,减少人为干预,实现节能减排。 其他说明:文章不仅提供了理论性的介绍,还有大量的实战经验和代码片段分享,有助于读者更好地理解和应用相关技术。

    CNN卷积神经网络FPGA加速器实现:从软件到硬件的深度学习部署

    内容概要:本文详细介绍了将卷积神经网络(CNN)从软件到硬件的全过程部署,特别是在FPGA上的实现方法。首先,作者使用TensorFlow 2构建了一个简单的CNN模型,并通过Python代码实现了模型的训练和权值导出。接着,作者用Verilog手写了CNN加速器的硬件代码,展示了如何通过参数化配置优化加速效果。硬件部分采用了滑动窗口和流水线结构,确保高效执行卷积操作。此外,文中还讨论了硬件调试过程中遇到的问题及其解决方案,如ReLU激活函数的零值处理和权值存储顺序的对齐问题。最后,作者强调了参数化设计的重要性,使得硬件可以在速度和面积之间灵活调整。 适合人群:对深度学习和FPGA感兴趣的开发者,尤其是有一定编程基础和技术背景的研究人员。 使用场景及目标:适用于希望深入了解CNN算法硬件实现的人群,目标是掌握从软件到硬件的完整部署流程,以及如何通过FPGA加速深度学习任务。 其他说明:文中提供了详细的代码片段和调试经验,有助于读者更好地理解和实践。同时,项目代码可在GitHub上获取,方便进一步研究和改进。

    无人驾驶车辆高速MPC控制:基于MATLAB与CarSim的双移线场景复现

    内容概要:本文详细介绍了无人驾驶车辆高速MPC(模型预测控制)控制系统的复现过程,主要涉及MATLAB和CarSim软件工具的应用。作者通过调整caraim文件、构建Simulink控制逻辑以及优化MPC算法,将原有的直线跟车场景成功转换为双移线场景。文中不仅展示了具体的技术实现步骤,如路径点设置、权重矩阵调整、采样时间对齐等,还分享了调试过程中遇到的问题及其解决方案,如参数不匹配、模型不收敛等。最终实现了车辆在虚拟环境中按预定双移线轨迹行驶的目标。 适合人群:从事无人驾驶车辆研究和技术开发的专业人士,尤其是对MPC控制算法感兴趣的工程师。 使用场景及目标:适用于需要深入了解无人驾驶车辆控制系统的设计与实现的研究人员和技术开发者。目标是帮助读者掌握如何利用MATLAB和CarSim进行无人驾驶车辆的模拟实验,特别是在高速场景下的双移线控制。 其他说明:文章强调了MPC在高速场景下的挑战性和调参技巧,提供了宝贵的实践经验。同时提醒读者注意环境配置、控制器核心代码解析以及联合仿真可能出现的问题。

    监控场景下基于CLIP的细粒度目标检测方法.pdf

    监控场景下基于CLIP的细粒度目标检测方法.pdf

    MATLAB频谱与功率谱分析:从理论到实践的全面解析

    内容概要:本文详细介绍了如何使用MATLAB进行频谱和功率谱分析,涵盖了从基础概念到高级应用的各个方面。首先,通过生成人工信号并绘制时域图,帮助读者熟悉基本操作。接着,深入探讨了频谱分析的关键步骤,如快速傅里叶变换(FFT)、窗口函数的选择、频谱横坐标的正确转换等。对于功率谱分析,则介绍了Welch法及其具体实现。针对真实数据处理,讨论了如何读取外部数据、处理非均匀采样、去除趋势项等问题,并提供了多种实用技巧,如滑动平均、自动标注主要频率成分等。此外,还强调了一些常见的错误和注意事项,确保读者能够避免常见陷阱。 适用人群:适用于具有一定MATLAB基础的科研人员、工程师和技术爱好者,特别是那些从事信号处理、通信工程、机械振动分析等领域的人士。 使用场景及目标:① 学习如何使用MATLAB进行频谱和功率谱分析;② 掌握处理实际工程中复杂信号的方法;③ 提高对信号特征的理解能力,以便更好地应用于故障诊断、质量检测等实际工作中。 其他说明:文中提供的代码片段可以直接用于实践,读者可以根据自己的需求进行适当修改。通过跟随文中的步骤,读者不仅能够学会如何绘制频谱图和功率谱图,还能深入了解背后的数学原理和技术细节。 标签1,MATLAB,频谱分析,功率谱,Welch法,FFT

    基于FAST与MATLAB/Simulink的5MW风力发电机PID变桨控制联合仿真研究

    内容概要:本文详细介绍了基于FAST与MATLAB/Simulink联合仿真平台,对5MW非线性风力发电机进行统一变桨(CPC)和独立变桨(IPC)控制策略的研究。首先,通过将OpenFAST编译成Simulink可调用的S-Function模块,构建了联合仿真环境。接着,分别实现了统一变桨和独立变桨的PID控制器,并在三维湍流风场中进行了性能测试。结果显示,独立变桨在转速稳定性和载荷控制方面表现出色,能够显著降低叶根挥舞弯矩和偏航力矩,从而提高风机的可靠性和使用寿命。然而,独立变桨也带来了作动器磨损增加的问题。 适合人群:从事风电控制系统设计、仿真建模以及希望深入了解变桨控制策略的研发工程师和技术研究人员。 使用场景及目标:适用于需要评估不同变桨控制策略在复杂风场条件下的性能表现,优化风机运行效率和可靠性,以及探索新的控制算法的应用场景。 其他说明:文中提供了详细的模型搭建步骤、关键代码片段和仿真结果分析,并附有相关参考文献和GitHub资源链接,方便读者进一步深入研究。

Global site tag (gtag.js) - Google Analytics