XML解析神器:Apache Commons Digester

XML解析神器:Apache Commons Digester_第1张图片

第1章:引言

大家好,我是小黑。今天咱们聊聊一个在现代编程中经常遇到的话题:XML解析。你可能知道,XML(可扩展标记语言)因其灵活性和可读性,在配置文件、数据交换等方面广泛使用。但是,XML解析有时候会让人头疼,尤其是当文件结构复杂或者数据量巨大时。这时候,一个好用的工具就显得尤为重要了。

在Java世界里,有很多工具可以用来解析XML,比如JAXP, JAXB, DOM4J等。但今天咱们要讨论的是Apache Commons Digester。为什么选择它呢?因为它既简单又强大,非常适合那些想要快速而又不失灵活性处理XML的场景。Commons Digester通过定义一系列的规则来解析XML,让整个过程变得直观且容易控制。这样一来,咱们就可以专注于业务逻辑,而不是被繁琐的XML解析细节困扰。

第2章:什么是Commons Digester?

先来简单介绍一下Apache Commons Digester。这是一个开源的Java库,属于Apache Commons项目的一部分。Commons Digester的设计初衷是简化XML到Java对象的映射过程。简单地说,它可以将XML文档转换成Java对象,而且这个过程完全基于你定义的规则。

那这个过程是怎样的呢?其实,Commons Digester工作原理非常直观。它读取XML文档,根据你提前定义的一组规则,触发相应的操作。这些操作通常包括创建对象、调用方法、设置属性等。通过这种方式,XML文档中的数据就被有效地映射到了Java对象上。

这听起来可能有点抽象,别急,咱们来看一个简单的例子。假设有这样一个XML文件:

<Person>
    <Name>张三Name>
    <Age>30Age>
Person>

咱们想要将这个XML映射到一个Java的Person类上。这个类大概长这样:

public class Person {
    private String name;
    private int age;

    // 省略构造函数、getter和setter方法
}

要实现这个映射,你只需要定义相应的规则即可。Commons Digester让这个过程变得异常简单。在后续的章节里,小黑会带大家一步步学习如何定义这些规则,并且掌握Commons Digester的使用技巧。

第3章:依赖配置

要使用Commons Digester,你的项目需要能够访问到它的库文件。如果你的项目是基于Maven的,那就简单多了。只需要在项目的pom.xml文件中添加相应的依赖即可。这里是一个标准的依赖配置示例:

<dependencies>
    
    <dependency>
        <groupId>org.apache.commonsgroupId>
        <artifactId>commons-digester3artifactId>
        <version>3.2version> 
    dependency>
dependencies>

添加完依赖后,Maven会自动下载并添加Commons Digester到你的项目中。这样一来,咱们就可以在代码里自由地使用它了。

第4章:理解XML解析的基础

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它类似于HTML,但更加灵活,因为你可以自定义标签。XML被广泛用于配置文件、网络数据交换等场景。了解如何解析XML,对于一个Java开发者来说非常重要。

那么,XML解析到底是什么呢?简单来说,就是将XML文档转换成程序可以理解和操作的格式,比如Java对象。这个过程中,最核心的就是理解XML文档的结构。

来,咱们看一个XML的示例:

<Book>
    <Title>Java编程思想Title>
    <Author>张三Author>
    <Price>99Price>
Book>

这是一个描述书籍信息的XML。它有一个根元素,里面包含了三个子元素:</code>, <code><Author></code>, 和<code><Price></code>。</p> <p>在Java中,要解析这样的XML,你可能会想到创建一个对应的<code>Book</code>类:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Book</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> title<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token class-name">String</span> author<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> price<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>现在,咱们的任务就是将XML中的数据读取出来,填充到这个<code>Book</code>类的实例中。听起来是不是有点像魔法?但其实原理并不复杂。</p> <p>XML解析通常有两种方式:DOM解析和SAX解析。DOM解析会将整个XML文档加载到内存中,形成一个树状结构。这样做的好处是可以随机访问文档的任何部分,但缺点是消耗内存较大。SAX解析则是顺序读取XML文档,边读边解析,内存消耗小,但不能随机访问。</p> <p>Commons Digester提供了一种更加灵活的解析方式。它允许你定义一系列的规则,然后在解析XML文档时,根据这些规则来创建和填充Java对象。这种方式既节省内存,又相对直观。</p> <h4>第5章:Commons Digester的核心组件</h4> <p>Commons Digester的核心是<code>Digester</code>类。这个类是整个库的灵魂,负责读取XML文档,并根据定义的规则来操作XML数据。听起来很神奇对吧?别急,咱们来看看具体是怎么回事。</p> <h5>创建Digester实例</h5> <p>在开始解析XML之前,咱们首先需要创建一个<code>Digester</code>实例。这个过程非常简单:</p> <pre><code class="prism language-java"><span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>有了这个实例,咱们就可以开始定义一些规则,告诉<code>Digester</code>如何从XML中提取数据,并将这些数据映射到Java对象中。</p> <h5>定义解析规则</h5> <p>这里是Commons Digester真正强大的地方。你可以定义各种各样的规则来指导解析过程。比如,咱们有这样一个XML:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Person</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Name</span><span class="token punctuation">></span></span>李四<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Age</span><span class="token punctuation">></span></span>25<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Age</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Person</span><span class="token punctuation">></span></span> </code></pre> <p>咱们想将这个XML解析到一个<code>Person</code>类的实例中。这个类可能长这样:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>为了完成这个映射,咱们需要定义一些规则:</p> <pre><code class="prism language-java"><span class="token comment">// 创建Digester实例</span> <span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Person>标签时,创建一个Person类的实例</span> digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"Person"</span><span class="token punctuation">,</span> <span class="token class-name">Person</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Person>标签内的<Name>标签时,将其内容设置到Person实例的name属性上</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Person/Name"</span><span class="token punctuation">,</span> <span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 同理,处理<Age>标签</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Person/Age"</span><span class="token punctuation">,</span> <span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这样,当<code>Digester</code>解析到<code><Person></code>标签时,它就会创建一个<code>Person</code>实例。然后,遇到<code><Name></code>和<code><Age></code>标签时,它会将这些标签的内容分别设置到<code>Person</code>实例的<code>name</code>和<code>age</code>属性上。</p> <h5>解析XML</h5> <p>定义好规则后,剩下的就是让<code>Digester</code>解析XML了。这个过程也很直接:</p> <pre><code class="prism language-java"><span class="token class-name">Person</span> person <span class="token operator">=</span> digester<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这里,<code>xmlString</code>就是包含XML内容的字符串。<code>parse</code>方法会根据前面定义的规则,解析这个字符串,并返回一个填充好数据的<code>Person</code>实例。</p> <p>通过这些步骤,咱们就可以轻松地将XML数据映射到Java对象中了。看起来是不是很酷?但别忘了,这只是Commons Digester的冰山一角。它还有很多强大的功能等着咱们去探索。</p> <h4>第6章:实战演练:解析XML示例</h4> <p>假设咱们有这样一个XML文件,它描述了一本书的信息:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>王五<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> </code></pre> <p>咱们的任务是把这个XML文件中的数据解析到一个Java对象中。首先,咱们需要定义一个对应的Java类:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Book</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> title<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token class-name">String</span> author<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> price<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>接下来,就是使用Commons Digester来解析XML并填充这个<code>Book</code>类的实例了。</p> <h5>步骤1:创建Digester实例</h5> <pre><code class="prism language-java"><span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <h5>步骤2:定义解析规则</h5> <p>咱们需要告诉<code>Digester</code>,当遇到哪些XML元素时,应该执行什么操作:</p> <pre><code class="prism language-java"><span class="token comment">// 当遇到<Book>标签时,创建一个Book类的实例</span> digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"Book"</span><span class="token punctuation">,</span> <span class="token class-name">Book</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Book>下的<Title>标签时,将其内容设置到Book实例的title属性上</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Title"</span><span class="token punctuation">,</span> <span class="token string">"title"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 对<Author>和<Price>标签做同样的操作</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Author"</span><span class="token punctuation">,</span> <span class="token string">"author"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Price"</span><span class="token punctuation">,</span> <span class="token string">"price"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这样,<code>Digester</code>就知道了如何根据XML元素来创建和填充<code>Book</code>对象。</p> <h5>步骤3:解析XML</h5> <p>最后,咱们来解析XML文件:</p> <pre><code class="prism language-java"><span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token class-name">Book</span> book <span class="token operator">=</span> digester<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 这里的xmlString是包含上面XML内容的字符串</span> <span class="token comment">// 输出解析结果,检查是否正确</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"书名: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getTitle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"作者: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getAuthor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"价格: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"元"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> <span class="token class-name">SAXException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>这个过程中,如果一切顺利,你会看到控制台输出了解析后的书籍信息。</p> <p>通过这个实例,咱们可以看到,Commons Digester的确是一个非常强大且灵活的工具。它能够轻松地将XML文档中的数据映射到Java对象中,大大简化了XML处理的复杂性。</p> <h4>第7章:高级功能和技巧</h4> <h5>条件解析</h5> <p>在一些复杂的场景中,咱们可能只想在满足特定条件时才解析某些部分的XML。Commons Digester提供了条件解析的功能,让这成为可能。</p> <p>比如,假设咱们有一个包含多本书籍信息的XML,但只想解析价格超过100元的书:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Library</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>王五<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>高级Java技术<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>赵六<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>120<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Library</span><span class="token punctuation">></span></span> </code></pre> <p>咱们可以使用<code>Rule</code>类和它的子类来定义更复杂的解析规则。例如:</p> <pre><code class="prism language-java">digester<span class="token punctuation">.</span><span class="token function">addRule</span><span class="token punctuation">(</span><span class="token string">"Library/Book"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Rule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token class-name">String</span> namespace<span class="token punctuation">,</span> <span class="token class-name">String</span> name<span class="token punctuation">,</span> <span class="token class-name">Attributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> <span class="token comment">// 只有当书的价格大于100时,才创建Book对象</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token function">parseInt</span><span class="token punctuation">(</span>attributes<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">"Price"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Book</span> book <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Book</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> digester<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>book<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 其他规则定义...</span> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/4807c4a58bc94f50b6eef40579fc36ca.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4807c4a58bc94f50b6eef40579fc36ca.jpg" alt="XML解析神器:Apache Commons Digester_第2张图片" width="650" height="498" style="border:1px solid black;"></a></p> <p>这样,只有价格超过100元的书才会被解析和创建。</p> <h5>使用XPath</h5> <p>有时候,XML结构可能非常复杂,使用传统的路径可能不够灵活。这时,XPath就能大放异彩了。Commons Digester支持XPath表达式,让你能够更精确地定位XML中的元素。</p> <p>假设咱们的XML结构如下:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Library</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Section</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>编程<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 省略其他信息 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Section</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Section</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>设计<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- 设计相关的书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Section</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Library</span><span class="token punctuation">></span></span> </code></pre> <p>如果咱们只想解析“编程”部分的书籍,可以这样使用XPath:</p> <pre><code class="prism language-java">digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"/Library/Section[@name='编程']/Book"</span><span class="token punctuation">,</span> <span class="token class-name">Book</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 其他规则定义...</span> </code></pre> <p>这样,只有位于“编程”部分的书籍才会被解析。</p> <h5>实用技巧和最佳实践</h5> <ol> <li> <p><strong>日志记录</strong>:在解析XML时,使用日志记录可以帮助你更好地调试和跟踪解析过程。确保你的项目中有配置日志系统。</p> </li> <li> <p><strong>异常处理</strong>:当解析XML时,可能会遇到各种异常。确保你的代码能够妥善处理这些异常,避免程序崩溃。</p> </li> <li> <p><strong>性能考虑</strong>:如果你正在处理非常大的XML文件,注意监控内存和性能。在可能的情况下,考虑使用流式解析。</p> </li> <li> <p><strong>规则复用</strong>:如果你在多个地方使用了类似的解析规则,考虑创建通用的规则类,以提高代码的复用性和清晰度。</p> </li> </ol> <h4>第8章:XPath表达式</h4> <p>XPath是一种在XML文档中查找信息的语言,它可以用来定位和处理XML文档中的数据。当你的XML结构变得复杂,或者需要更精确的查询时,XPath就显得尤为重要了。</p> <h5>XPath表达式简介</h5> <p>XPath的全称是XML Path Language,即XML路径语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来有点像文件系统的路径,但用于定位XML文档中的元素。</p> <h5>基本的XPath语法</h5> <ul> <li> <p><strong>选取节点</strong>:XPath使用路径表达式来选取XML文档中的节点或节点集。比如,<code>/Bookstore/Book</code>会选取根元素为<code>Bookstore</code>下所有的<code>Book</code>节点。</p> </li> <li> <p><strong>谓词</strong>:谓词用于查找特定的节点或包含特定值的节点。例如,<code>/Bookstore/Book[1]</code>选取<code>Bookstore</code>下的第一个<code>Book</code>节点。</p> </li> <li> <p><strong>属性选择</strong>:可以使用<code>@</code>符号选取属性。例如,<code>/Bookstore/Book[@category='fiction']</code>选取所有<code>category</code>属性为<code>fiction</code>的<code>Book</code>节点。</p> </li> <li> <p><strong>通配符</strong>:星号<code>*</code>是一个通配符,匹配任何元素节点。例如,<code>/Bookstore/*</code>选取<code>Bookstore</code>下的所有子节点。</p> </li> </ul> <h5>XPath与Java</h5> <p>在Java中使用XPath,你需要借助一些工具,比如Java的XPath API。让我们通过一个例子来看看如何在Java中使用XPath。</p> <p>假设有这样一个XML:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Bookstore</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span> <span class="token attr-name">category</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fiction<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>哈利波特<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>JK.罗琳<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>68<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span> <span class="token attr-name">category</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>education<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程思想<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>Bruce Eckel<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Bookstore</span><span class="token punctuation">></span></span> </code></pre> <p>如果我们想要选取所有类别为<code>fiction</code>的书籍标题,可以这样做:</p> <pre><code class="prism language-java"><span class="token class-name">XPathFactory</span> xpathFactory <span class="token operator">=</span> <span class="token class-name">XPathFactory</span><span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">XPath</span> xpath <span class="token operator">=</span> xpathFactory<span class="token punctuation">.</span><span class="token function">newXPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">String</span> expression <span class="token operator">=</span> <span class="token string">"/Bookstore/Book[@category='fiction']/Title"</span><span class="token punctuation">;</span> <span class="token class-name">InputSource</span> inputSource <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InputSource</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">NodeList</span> nodes <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">NodeList</span><span class="token punctuation">)</span> xpath<span class="token punctuation">.</span><span class="token function">evaluate</span><span class="token punctuation">(</span>expression<span class="token punctuation">,</span> inputSource<span class="token punctuation">,</span> <span class="token class-name">XPathConstants</span><span class="token punctuation">.</span><span class="token constant">NODESET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> nodes<span class="token punctuation">.</span><span class="token function">getLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">item</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTextContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/38ca38d339fa4ab2b9aa23f1378536fd.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/38ca38d339fa4ab2b9aa23f1378536fd.jpg" alt="XML解析神器:Apache Commons Digester_第3张图片" width="650" height="409" style="border:1px solid black;"></a></p> <p>这段代码将输出所有类别为<code>fiction</code>的书籍的标题。</p> <h5>XPath的高级用法</h5> <p>XPath不仅限于基本的查询。它还支持更复杂的操作,比如选择特定属性的所有节点、使用运算符进行条件判断等。这使得XPath成为在处理复杂XML文档时非常强大的工具。</p> <h4>第9章:总结</h4> <h5>解析规则的灵活性</h5> <p>Commons Digester的另一个亮点是它的解析规则。咱们可以定义非常具体的规则,来精确地控制解析过程。这些规则不仅包括基本的对象创建和属性设置,还可以扩展到条件解析和使用XPath等更高级的功能。</p> <h5>XPath的强大</h5> <p>咱们深入了解了XPath这个强大的XML路径语言。它提供了一种非常灵活和强大的方式来查询和处理XML文档。使用XPath,咱们可以轻松定位到XML文档中的特定节点,进行高效的数据提取和操作。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1742982233628622848"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Apache,Commons,工具实战手册,xml,apache,java)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1884670384784076800.htm" title="基于Python+Spark的气象天气分析大屏可视化系统设计与实现毕设源码" target="_blank">基于Python+Spark的气象天气分析大屏可视化系统设计与实现毕设源码</a> <span class="text-muted">sj52abcd</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a> <div>博主介绍:✌专注于VUE,小程序,安卓,Java,python,物联网专业,有17年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。研究的背景:随着我国气象事业的发展,气象数据的实时分析和可视化成为越来越重要的任务。然而,目前气象数据的分析与展示手段仍然较为传统,缺乏交互性,不能满足现代气象业务的需求。因此,研究一种基于Pytho</div> </li> <li><a href="/article/1884670005933568000.htm" title="到底谁在说Nature Communications和Science Advances是水刊?" target="_blank">到底谁在说Nature Communications和Science Advances是水刊?</a> <span class="text-muted">迪娜学姐</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/1.htm">论文阅读</a> <div>我是娜姐@迪娜学姐,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。为什么说这两个期刊是水刊?评论很主观,褒贬不一,来看看详细的期刊指标吧。NatureCommunications(NC):创刊于2011年,隶属于Nature出版集团。最新影响因子JCR202216.6,在JCR和中科院系统都属于Q1区综合性Top期刊。不可否认,指标很过硬。NC收稿范围广泛,包括但不限于生物、医学、健康</div> </li> <li><a href="/article/1884670006659182592.htm" title="论文AI率:检测原理是什么?该如何降低论文AI率?" target="_blank">论文AI率:检测原理是什么?该如何降低论文AI率?</a> <span class="text-muted">迪娜学姐</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>我是娜姐@迪娜学姐,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。上一篇介绍了10个检测AI率的在线工具。本篇来说说AI率到底是如何检测出来的?该如何有效降低论文的AI率?和AI大模型一样,AI检测的核心也是机器学习模型,它们在包含人类创作和AI生成文本样本的大型数据集上进行训练,通过学习每种文本中存在的模式和特征,以此来区分人类创作的文本和AI生成文本。AI检测器查找的一些关键特征包</div> </li> <li><a href="/article/1884669502013108224.htm" title="webpack-bundle-analyzer 打包分析工具" target="_blank">webpack-bundle-analyzer 打包分析工具</a> <span class="text-muted">cc蒲公英</span> <a class="tag" taget="_blank" href="/search/%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7/1.htm">辅助工具</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>移动端项目优化的时候,需要这个插件来可视化查看打包大小,在此记录下插件官网地址一.安装npminstall--save-devwebpack-bundle-analyzer二.使用方式:1.作为插件使用(推荐)在webpack配置文件,如果有生产配置文件放入生产配置文件里require方式引入进来,然后在plugins配置项new一个实例即可constwebpack=require('webpac</div> </li> <li><a href="/article/1884668240978833408.htm" title="自动化办公测试" target="_blank">自动化办公测试</a> <span class="text-muted">祖力皮喀尔07</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a> <div>CSDN自动化测试:提升效率与质量的利器在当今快速发展的软件开发领域,自动化测试已成为确保软件质量和提高开发效率的关键环节。CSDN作为中国领先的开发者社区,为自动化测试领域提供了丰富的资源和交流平台。本文将深入探讨CSDN在自动化测试方面的应用,以及如何通过自动化测试提升软件开发的效率和质量。自动化测试的重要性自动化测试是指使用自动化工具来执行测试用例,以验证软件产品的功能和性能是否符合预期。与</div> </li> <li><a href="/article/1884666854337736704.htm" title="数仓的数据加工过程-ETL" target="_blank">数仓的数据加工过程-ETL</a> <span class="text-muted">星月情缘02</span> <a class="tag" taget="_blank" href="/search/ETL%E6%8A%80%E6%9C%AF/1.htm">ETL技术</a><a class="tag" taget="_blank" href="/search/etl/1.htm">etl</a> <div>ETL代表ExtractTransform和Load。ETL将所有三个数据库功能组合到一个工具中,以从一个数据库获取数据并将其放入另一个数据库。提取:提取是从数据库中提取(读取)信息的过程。在此阶段,从多个或不同类型的来源收集数据。转换:转换是将提取的数据从之前的形式转换为所需形式的过程。数据可以放入另一个数据库。可以通过使用规则或查找表或将数据与其他数据组合来进行转换。加载:加载是将数据写入目标</div> </li> <li><a href="/article/1884665843963457536.htm" title="游戏引擎介绍:Game Engine" target="_blank">游戏引擎介绍:Game Engine</a> <span class="text-muted">He Des</span> <a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E/1.htm">游戏引擎</a> <div>简介定义:软件框架,一系列为开发游戏的工具的集合可协作创意生产工具,复杂性艺术,注重realtime实时目的为艺术家,设计师,程序员设计工具链游戏引擎开发参考书推荐:GameEngineArchitecturalbyJasonGregroy观察引擎代码先看update函数骨干架构基础构建Architectural:引擎架构与层级Layer,数据组织与管理DataManagement渲染Render</div> </li> <li><a href="/article/1884664710222114816.htm" title="Oracle ASM命令行工具asmcmd命令及其使用方法" target="_blank">Oracle ASM命令行工具asmcmd命令及其使用方法</a> <span class="text-muted">zxrhhm</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>asmcmd是OracleASM(AutomaticStorageManagement)的一个命令行工具,用于直接管理和操作ASM实例和磁盘组。以下是一些常用的asmcmd命令及其使用方法的简要说明:一、基本命令1.1、启动asmcmd[grid@racdb2:/home/grid]$asmcmdASMCMD>--或者,如果您以特定用户身份运行(例如`grid`用户),可以使用:su-gridas</div> </li> <li><a href="/article/1884662189269250048.htm" title="抓包工具:Mitmproxy" target="_blank">抓包工具:Mitmproxy</a> <span class="text-muted">一张假钞</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a> <div>Mitmproxy是一组工具,它们为HTTP/1、HTTP/2和WebSocket提供交互式、支持SSL/TLS的拦截代理。特性拦截HTTP和HTTPS请求和响应并动态修改它们。保存完整的HTTP对话,以便以后重放和分析。重放HTTP会话的客户端。重放以前记录的服务器的HTTP响应。反向代理模式将流量转发到指定的服务器。MacOS和Linux上的透明代理模式。使用Python脚本对HTTP流量进行</div> </li> <li><a href="/article/1884659290619310080.htm" title="Apache STORM工作原理详解" target="_blank">Apache STORM工作原理详解</a> <span class="text-muted">Neil Parker</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>ApacheStorm是一个分布式实时计算系统,允许用户在集群上运行流式数据处理应用程序。它的核心原理是将流式数据分割成多个小块,每个小块都会被分配给不同的计算节点进行处理,并且处理结果会被发送到下一个节点,直到达到最终结果。以下是ApacheStorm的工作原理:Nimbus是整个集群的控管核心,负责topology的提交、运行状态监控、任务重新分配等工作。zk就是一个管理者,监控者。总体描述:</div> </li> <li><a href="/article/1884657778014875648.htm" title="DDD架构实战第六讲总结:领域驱动设计中的聚合" target="_blank">DDD架构实战第六讲总结:领域驱动设计中的聚合</a> <span class="text-muted">每天三杯咖啡</span> <a class="tag" taget="_blank" href="/search/DDD/1.htm">DDD</a> <div>云架构师系列课程之DDD架构实战第六讲总结:领域驱动设计中的聚合聚合提升了对象系统的粒度,保证了业务逻辑的完整性,减少了错误产生的概率一、引言本讲将探讨领域驱动设计(DDD)中的重要概念——聚合。聚合是业务完整性的单元,是一个更大力度的封装。在领域驱动设计中,聚合处于生命周期模型的核心位置。理解聚合有助于理解资源库和工厂的概念。二、领域模型复习回顾领域模型出行计划:用户创建出行计划,包含出发时间、</div> </li> <li><a href="/article/1884655382056464384.htm" title="Java框架介绍:Quartz从入门到进阶(图)" target="_blank">Java框架介绍:Quartz从入门到进阶(图)</a> <span class="text-muted">hdy007</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BD%9C%E4%B8%9A/1.htm">作业</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8/1.htm">存储</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Q</div> </li> <li><a href="/article/1884654750553665536.htm" title="推荐开源神器:video-srt — 自动识别视频语音并生成字幕" target="_blank">推荐开源神器:video-srt — 自动识别视频语音并生成字幕</a> <span class="text-muted">赵鹰伟Meadow</span> <div>推荐开源神器:video-srt—自动识别视频语音并生成字幕去发现同类优质开源项目:https://gitcode.com/在数字媒体制作和在线教育领域,自动字幕生成是一个巨大的需求。今天,我们有幸向您推荐一款强大的开源命令行工具——video-srt。它能够智能地识别视频中的语音并自动生成准确的SRT字幕文件,极大地提高了工作效率。1、项目介绍video-srt是一个基于Go语言开发的工具,利用</div> </li> <li><a href="/article/1884654751006650368.htm" title="推荐开源神器:Autosub——自动字幕生成器" target="_blank">推荐开源神器:Autosub——自动字幕生成器</a> <span class="text-muted">任轶眉Tracy</span> <div>推荐开源神器:Autosub——自动字幕生成器项目地址:https://gitcode.com/gh_mirrors/au/autosub在多媒体内容日益丰富的今天,字幕已经成为观看视频的重要辅助工具。然而,手动创建字幕是一项耗时且繁琐的工作。幸运的是,有一个名为Autosub的开源项目,它能自动识别并生成视频的字幕,大大简化了这一过程。项目介绍Autosub是一个高效实用的工具,专门用于自动语音</div> </li> <li><a href="/article/1884654371296309248.htm" title="PHP代码免费加密平台:保护你的代码安全" target="_blank">PHP代码免费加密平台:保护你的代码安全</a> <span class="text-muted">网友阿贵</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>PHP代码免费加密平台:保护你的代码安全引言在开发过程中,保护源代码的安全性是非常重要的。PHP作为一种广泛使用的服务器端脚本语言,其代码的安全性尤为重要。为了帮助开发者更好地保护自己的代码,我们推出了PHP代码免费加密平台(php.javait.cn)。本文将详细介绍该平台的功能和使用方法。平台简介1.平台功能PHP代码免费加密平台提供了以下主要功能:PHP混淆加密:无需安装组件运行,兼容主流P</div> </li> <li><a href="/article/1884651722811437056.htm" title="Selenium 浏览器操作与使用技巧——详细解析(Java版)" target="_blank">Selenium 浏览器操作与使用技巧——详细解析(Java版)</a> <span class="text-muted">Future_yzx</span> <a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>目录一、浏览器及窗口操作二、键盘与鼠标操作三、勾选复选框四、多层框架/窗口定位五、操作下拉框六、上传文件操作七、处理弹窗与alert八、处理动态元素九、使用Selenium进行网站监控前言Selenium是一款非常强大的Web自动化测试工具,能够帮助开发者与测试人员进行浏览器的自动化操作。通过Selenium,您不仅可以进行传统的自动化测试,还可以实现网站监控、动态元素处理、用户交互等高级功能。本</div> </li> <li><a href="/article/1884647941596049408.htm" title="Quartz 架构和单体应用介绍" target="_blank">Quartz 架构和单体应用介绍</a> <span class="text-muted">小马不敲代码</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/1.htm">定时任务</a> <div>一、摘要Quartz架构介绍SpringBootQuartz应用整合二、关于QuartzQuartz是OpenSymphony开源组织在Jobscheduling领域开源的一个作业调度框架项目,完全由Java编写,主要是为了实现在Java应用程序中进行作业调度并提供了简单却强大的机制!Quartz不仅可以单独使用,还可以与J2EE与J2SE应用程序相结合使用!同时,Quartz允许程序开发人员根据</div> </li> <li><a href="/article/1884647689392549888.htm" title="技术文档规划布局:构建系统性与连贯性的架构" target="_blank">技术文档规划布局:构建系统性与连贯性的架构</a> <span class="text-muted">m0_74136676</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a> <div>在技术文档的创作历程中,规划布局堪称构建稳固大厦的蓝图设计环节。合理确定文档的整体架构,包括精心设计章节设置与巧妙安排逻辑顺序,是确保信息呈现系统性与连贯性的关键所在,直接关系到文档的质量与可用性。一、明确核心主题与目标受众在着手规划文档架构之前,必须对文档的核心主题有透彻的理解。无论是关于一款软件的使用指南、一项技术的研发手册还是某个系统的运维说明,明确主题边界与重点内容是基础。同时,精准定位目</div> </li> <li><a href="/article/1884644035696586752.htm" title="Spring Boot 整合 Apollo 配置中心实战" target="_blank">Spring Boot 整合 Apollo 配置中心实战</a> <span class="text-muted">疯狂的键盘侠</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/apollo/1.htm">apollo</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>SpringBoot整合Apollo配置中心实战一、Apollo简介二、环境准备三、项目整合步骤四、配置使用示例五、常见问题及解决在分布式系统开发中,配置管理至关重要。Apollo作为携程开源的一款可靠的配置中心,能高效地集中管理应用配置,实现实时更新推送,助力开发者轻松应对复杂多变的配置场景。本文将带你一步步完成SpringBoot项目与Apollo配置中心的整合,让你的应用配置管理如鱼得水。一</div> </li> <li><a href="/article/1884643280285659136.htm" title="Spring Boot 中文参考指南" target="_blank">Spring Boot 中文参考指南</a> <span class="text-muted">阿提说说</span> <a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/Boot/1.htm">Boot</a><a class="tag" taget="_blank" href="/search/3.x/1.htm">3.x</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E8%AE%B2/1.htm">精讲</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>SpringBoot版本2.7.8原文:https://docs.spring.io/spring-boot/docs/2.7.8/reference/htmlsingle/—笔者注:SpringBoot3.x第一个GA版本已于22年底发布,2.7.8是2.x的最后一个GA版本,我觉得一段时间内依然会以2.x为主,该文大部分通过软件翻译,再加上自己的经验理解进行整理和注释,目的用来作为手册查找和知</div> </li> <li><a href="/article/1884643279509712896.htm" title="Maven项目管理随记" target="_blank">Maven项目管理随记</a> <span class="text-muted">brisk_time</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/1.htm">工具使用</a><a class="tag" taget="_blank" href="/search/maven%E5%B7%A5%E5%85%B7%E9%9A%8F%E8%AE%B0/1.htm">maven工具随记</a> <div>本篇文章仅为Maven学习随记一:maven介绍与环境搭建:maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。下载好后:①:bin目录下面包含mvn的运行脚本②:boot目录包含了一个类加载器的框架③:conf是配置文件的目录④:lib是maven运行时所需要的类库,除了自身的还包含了maven运行时所依赖的第三方的类库。二:maven目</div> </li> <li><a href="/article/1884642648082411520.htm" title="AI 集群:Exo 项目详解" target="_blank">AI 集群:Exo 项目详解</a> <span class="text-muted">ivwdcwso</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Exo/1.htm">Exo</a> <div>引言随着人工智能技术的迅猛发展,越来越多的人希望在家中运行自己的AI集群。传统的AI集群通常需要昂贵的硬件和复杂的配置,但Exo项目正是为了解决这个问题而诞生的。Exo项目旨在让你利用日常电子设备,轻松搭建一个高效的AI集群。本文将详细介绍Exo项目的特点、安装步骤和实战示例。©ivwdcwso(ID:u012172506)Exo项目特点1.广泛的模型支持Exo支持多种流行的AI模型,包括但不限于</div> </li> <li><a href="/article/1884641134572007424.htm" title="Python可视化Seaborn库绘图(参数说明+代码实战)" target="_blank">Python可视化Seaborn库绘图(参数说明+代码实战)</a> <span class="text-muted">步入烟尘</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/Seaborn/1.htm">Seaborn</a><a class="tag" taget="_blank" href="/search/%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">可视化</a> <div>本文已收录于《Python超入门指南全册》本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从基础到精通不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/mrdeam/category_12647587.html优点:订阅限时19.9付费专栏,私信博主还可进入全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以</div> </li> <li><a href="/article/1884638739284684800.htm" title="protoc-go-inject-tag 使用教程" target="_blank">protoc-go-inject-tag 使用教程</a> <span class="text-muted">农彩媛Louise</span> <div>protoc-go-inject-tag使用教程项目地址:https://gitcode.com/gh_mirrors/pr/protoc-go-inject-tag项目介绍protoc-go-inject-tag是一个用于在生成的Go结构体中注入自定义标签的工具。在使用ProtocolBuffers(protobuf)生成Go代码时,默认情况下生成的结构体标签是固定的,无法灵活设置。protoc</div> </li> <li><a href="/article/1884636343531794432.htm" title="Linux系统下获取本机IP地址" target="_blank">Linux系统下获取本机IP地址</a> <span class="text-muted">DpgrMl</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>在Linux系统中,我们可以使用一些命令和工具来获取本机的IP地址。下面将介绍几种常用的方法。使用ifconfig命令ifconfig命令是一个用于配置网络接口的工具,我们可以使用它来获取本机的IP地址。打开终端,输入以下命令:ifconfig该命令会列出当前系统中所有的网络接口信息,包括IP地址、子网掩码等。通常,我们可以找到类似于以下形式的信息:eth0Linkencap:EthernetHW</div> </li> <li><a href="/article/1884634829937504256.htm" title="免费去水印神器推荐:支持视频与图片一键处理" target="_blank">免费去水印神器推荐:支持视频与图片一键处理</a> <span class="text-muted">俊哥工具</span> <a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a><a class="tag" taget="_blank" href="/search/postman/1.htm">postman</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E4%BA%92/1.htm">交互</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pygame/1.htm">pygame</a> <div>大家好,我是俊哥。一个专注分享的小博主,大家记得点个关注哦~每天给大家分享各种软件,超好用的资源、软件、网站,偶尔还会有福利频道,免费分享,大家的关注就是对我最大的支持!软件都具有一定的时效性,软件可能会经常更新,请关注我,我会定期更新失效的软件!谢谢大家的支持!运营视频号或图文号的朋友,经常需要从网上下载视频或图片素材,但水印问题让人头疼。今天推荐一款免费去水印工具,支持视频和图片一键处理,适用</div> </li> <li><a href="/article/1884631298748772352.htm" title="3步搞定:java分布式WebSocket与消息队列的奇妙邂逅?" target="_blank">3步搞定:java分布式WebSocket与消息队列的奇妙邂逅?</a> <span class="text-muted">墨瑾轩</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6%E5%AD%A6Java%E3%80%90%E4%B8%80%E3%80%91/1.htm">一起学学Java【一】</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣嘿,亲爱的开发者们!今天我们要聊的是那个让分布式系统心跳加速的热门话题——如何用消息队列轻松实现分布式WebSocket。别急,我会一步步带你走进这个奇妙的世界,让你轻松掌握这门技艺。准备好了吗?让我们开始这场技术盛宴吧!引言在这个信息爆炸的时代,WebSoc</div> </li> <li><a href="/article/1884631299528912896.htm" title="JAVA开源免费项目 基于Vue和SpringBoot的医院后台管理系统(附源码)" target="_blank">JAVA开源免费项目 基于Vue和SpringBoot的医院后台管理系统(附源码)</a> <span class="text-muted">胡晗靓</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>本文项目编号T170,文末自助获取源码\color{red}{T170,文末自助获取源码}T170,文末自助获取源码目录一、系统介绍二、数据库设计三、配套教程3.1启动教程3.2讲解视频3.3二次开发教程四、功能截图五、文案资料5.1选题背景5.2国内外研究现状六、核心代码6.1查询数据6.2新增数据6.3删除数据一、系统介绍在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功</div> </li> <li><a href="/article/1884627012497240064.htm" title="python 监控键盘输入_python 监控键盘输入" target="_blank">python 监控键盘输入_python 监控键盘输入</a> <span class="text-muted">weixin_39717121</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E6%8E%A7%E9%94%AE%E7%9B%98%E8%BE%93%E5%85%A5/1.htm">监控键盘输入</a> <div>软件测试精品文章汇总测试基础python测试开发库及项目谷歌如何测试软件python工具书籍下载-持续更新2018软件测试标准汇总下载python测试开发自学每周一练python测试工具开发自学每周一练-2018-06软件测试工具书籍与面试题汇总下载(持续更新)python测试开发自动化测试数据分析...文章python人工智能命理2019-05-131907浏览量Shell历史记录异地留痕审计与</div> </li> <li><a href="/article/1884626508748746752.htm" title="pythonmayavi三维建模可视化_Mayavi-更方便的可视化" target="_blank">pythonmayavi三维建模可视化_Mayavi-更方便的可视化</a> <span class="text-muted">ftggggc</span> <div>#Mayavi-更方便的可视化虽然VTK3D可视化软件包功能强大,Python的TVTK包装方便简洁,但是要用这些工具快速编写实用的三维可视化程序仍然需要花费不少的精力。因此基于VTK开发了许多可视化软件,例如:ParaView、VTKDesigner2、Mayavi2等等。Mayavi2完全用Python编写,因此它不但是一个方便实用的可视化软件,而且可以方便地用Python编写扩展,嵌入到用户</div> </li> <li><a href="/article/72.htm" title="Java开发中,spring mvc 的线程怎么调用?" target="_blank">Java开发中,spring mvc 的线程怎么调用?</a> <span class="text-muted">小麦麦子</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>今天逛知乎,看到最近很多人都在问spring mvc 的线程http://www.maiziedu.com/course/java/ 的启动问题,觉得挺有意思的,那哥们儿问的也听仔细,下面的回答也很详尽,分享出来,希望遇对遇到类似问题的Java开发程序猿有所帮助。 问题:     在用spring mvc架构的网站上,设一线程在虚拟机启动时运行,线程里有一全局</div> </li> <li><a href="/article/199.htm" title="maven依赖范围" target="_blank">maven依赖范围</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.test 测试的时候才会依赖,编译和打包不依赖,如junit不被打包 2.compile 只有编译和打包时才会依赖 3.provided 编译和测试的时候依赖,打包不依赖,如:tomcat的一些公用jar包 4.runtime 运行时依赖,编译不依赖 5.默认compile 依赖范围compile是支持传递的,test不支持传递 1.传递的意思是项目A,引用</div> </li> <li><a href="/article/326.htm" title="Jaxb org.xml.sax.saxparseexception : premature end of file" target="_blank">Jaxb org.xml.sax.saxparseexception : premature end of file</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/premature/1.htm">premature</a><a class="tag" taget="_blank" href="/search/JAXB/1.htm">JAXB</a> <div>如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误: org.xml.sax.saxparseexception : premature end of file 很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new In</div> </li> <li><a href="/article/453.htm" title="CSS Specificity" target="_blank">CSS Specificity</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%87%8D/1.htm">权重</a><a class="tag" taget="_blank" href="/search/Specificity/1.htm">Specificity</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>  有时候对于页面元素设置了样式,可为什么页面的显示没有匹配上呢? because specificity CSS 的选择符是有权重的,当不同的选择符的样式设置有冲突时,浏览器会采用权重高的选择符设置的样式。     规则:   HTML标签的权重是1 Class 的权重是10 Id 的权重是100 </div> </li> <li><a href="/article/580.htm" title="java与servlet" target="_blank">java与servlet</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>servlet 搞java web开发的人一定不会陌生,而且大家还会时常用到它。 下面是java官方网站上对servlet的介绍: java官网对于servlet的解释 写道 Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending and enha</div> </li> <li><a href="/article/707.htm" title="eclipse中安装maven插件" target="_blank">eclipse中安装maven插件</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.首先去官网下载 Maven: http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.2.3-bin.tar.gz 下载完成之后将其解压, 我将解压后的文件夹:apache-maven-3.2.3, 并将它放在 D:\tools目录下, 即 maven 最终的路径是:D:\tools\apache-mave</div> </li> <li><a href="/article/834.htm" title="jpa@OneToOne关联关系" target="_blank">jpa@OneToOne关联关系</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/jpa/1.htm">jpa</a> <div>Nruser里的pruserid关联到Pruser的主键id,实现对一个表的增删改,另一个表的数据随之增删改。 Nruser实体类 //***************************************************************** @Entity @Table(name="nruser") @DynamicInsert @Dynam</div> </li> <li><a href="/article/961.htm" title="我的spring学习笔记11-Spring中关于声明式事务的配置" target="_blank">我的spring学习笔记11-Spring中关于声明式事务的配置</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a> <div>这两天学到事务管理这一块,结合到之前的terasoluna框架,觉得书本上讲的还是简单阿。我就把我从书本上学到的再结合实际的项目以及网上看到的一些内容,对声明式事务管理做个整理吧。我看得Spring in Action第二版中只提到了用TransactionProxyFactoryBean和<tx:advice/>,定义注释驱动这三种,我承认后两种的内容很好,很强大。但是实际的项目当中</div> </li> <li><a href="/article/1088.htm" title="java 动态代理简单实现" target="_blank">java 动态代理简单实现</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/handler/1.htm">handler</a><a class="tag" taget="_blank" href="/search/proxy/1.htm">proxy</a><a class="tag" taget="_blank" href="/search/dynamic/1.htm">dynamic</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a> <div>dynamicproxy.service.HelloService package dynamicproxy.service; public interface HelloService { public void sayHello(); }   dynamicproxy.service.impl.HelloServiceImpl package dynamicp</div> </li> <li><a href="/article/1215.htm" title="JDBC连接数据库" target="_blank">JDBC连接数据库</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JDBC%E7%BC%96%E7%A8%8B/1.htm">JDBC编程</a><a class="tag" taget="_blank" href="/search/JAVA%E6%93%8D%E4%BD%9Coracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">JAVA操作oracle数据库</a> <div>         如果我们要想连接oracle公司的数据库,就要首先下载oralce公司的驱动程序,将这个驱动程序的jar包导入到我们工程中;   JDBC链接数据库的代码和固定写法;     1,加载oracle数据库的驱动;     &nb</div> </li> <li><a href="/article/1342.htm" title="单例模式中的多线程分析" target="_blank">单例模式中的多线程分析</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。 饿汉式: package com.bijian.study; public class Singleton { private Singleton() { } // 注意这是private 只供内部调用 private static</div> </li> <li><a href="/article/1469.htm" title="javascript读取和修改原型特别需要注意原型的读写不具有对等性" target="_blank">javascript读取和修改原型特别需要注意原型的读写不具有对等性</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/prototype/1.htm">prototype</a> <div>        对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有</div> </li> <li><a href="/article/1596.htm" title="【持久化框架MyBatis3六】MyBatis3集成第三方DataSource" target="_blank">【持久化框架MyBatis3六】MyBatis3集成第三方DataSource</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/dataSource/1.htm">dataSource</a> <div>MyBatis内置了数据源的支持,如:   <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <data</div> </li> <li><a href="/article/1723.htm" title="我程序中用到的urldecode和base64decode,MD5" target="_blank">我程序中用到的urldecode和base64decode,MD5</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a><a class="tag" taget="_blank" href="/search/base64decode/1.htm">base64decode</a><a class="tag" taget="_blank" href="/search/urldecode/1.htm">urldecode</a> <div>这里是base64decode和urldecode,Md5在附件中。因为我是在后台所以需要解码: string Base64Decode(const char* Data,int DataByte,int& OutByte) { //解码表 const char DecodeTable[] = { 0, 0, 0, 0, 0, 0</div> </li> <li><a href="/article/1850.htm" title="腾讯资深运维专家周小军:QQ与微信架构的惊天秘密" target="_blank">腾讯资深运维专家周小军:QQ与微信架构的惊天秘密</a> <span class="text-muted">ronin47</span> <div>社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社交平台更是火到爆,QQ和微信坐拥几亿的粉丝,QQ空间和朋友圈各种刷屏,写心得,晒照片,秀视频,那么谁来为企鹅保驾护航呢?支撑QQ和微信海量数据背后的架构又有哪些惊天内幕呢?本期大讲堂的内容来自今年2月份ChinaUnix对腾讯社交网络运营服务中心</div> </li> <li><a href="/article/1977.htm" title="java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素" target="_blank">java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class MinOfShiftedArray { /** * Q69 旋转数组的最小元素 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。 * 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 */ publ</div> </li> <li><a href="/article/2104.htm" title="看博客,应该是有方向的" target="_blank">看博客,应该是有方向的</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E5%8F%8D%E7%9C%81/1.htm">反省</a><a class="tag" taget="_blank" href="/search/%E7%9C%8B%E5%8D%9A%E5%AE%A2/1.htm">看博客</a> <div>看博客,应该是有方向的:  我现在就复习以前的,在补补以前不会的,现在还不会的,同时完善完善项目,也看看别人的博客.  我刚突然想到的:  1.应该看计算机组成原理,数据结构,一些算法,还有关于android,java的。  2.对于我,也快大四了,看一些职业规划的,以及一些学习的经验,看看别人的工作总结的.    为什么要写</div> </li> <li><a href="/article/2231.htm" title="[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖" target="_blank">[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">开源项目</a> <div>      为什么这样说呢?  因为科学和技术的发展有时候需要一个平缓和长期的积累过程,但是行政和商业体系本身充满各种不稳定性和不确定性,如果你希望长期从事某个科研项目,但是却又必须依赖于某种行政和商业体系,那其中的过程必定充满各种风险。。。       所以,为避免这种不确定性风险,我</div> </li> <li><a href="/article/2358.htm" title="一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )" target="_blank">一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>见   http://www.itpub.net/forum.php?mod=viewthread&tid=239011 Web翻页优化实例 提交时间: 2004-6-18 15:37:49      回复    发消息  环境: Linux ve</div> </li> <li><a href="/article/2485.htm" title="Hibernat and Ibatis" target="_blank">Hibernat and Ibatis</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>Hibernate  VS  iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mappi</div> </li> <li><a href="/article/2612.htm" title="备份MYSQL脚本" target="_blank">备份MYSQL脚本</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>#!/bin/sh # this shell to backup mysql #1413161683@qq.com (QQ:1413161683 DuChengJiu) _dbDir=/var/lib/mysql/ _today=`date +%w` _bakDir=/usr/backup/$_today [ ! -d $_bakDir ] && mkdir -p </div> </li> <li><a href="/article/2739.htm" title="iOS第三方开源库的吐槽和备忘" target="_blank">iOS第三方开源库的吐槽和备忘</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>转自 ibireme的博客   做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽。   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code、SourceForge等地方。由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库。   首先整理了一份 Github上排名靠</div> </li> <li><a href="/article/2866.htm" title="html wlwmanifest.xml" target="_blank">html wlwmanifest.xml</a> <span class="text-muted">eoems</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>所谓优化wp_head()就是把从wp_head中移除不需要元素,同时也可以加快速度。 步骤: 加入到function.php remove_action('wp_head', 'wp_generator'); //wp-generator移除wordpress的版本号,本身blog的版本号没什么意义,但是如果让恶意玩家看到,可能会用官网公布的漏洞攻击blog remov</div> </li> <li><a href="/article/2993.htm" title="浅谈Java定时器发展" target="_blank">浅谈Java定时器发展</a> <span class="text-muted">hacksin</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a> <div>java在jdk1.3中推出了定时器类Timer,而后在jdk1.5后由Dou Lea从新开发出了支持多线程的ScheduleThreadPoolExecutor,从后者的表现来看,可以考虑完全替代Timer了。 Timer与ScheduleThreadPoolExecutor对比: 1.    Timer始于jdk1.3,其原理是利用一个TimerTask数组当作队列</div> </li> <li><a href="/article/3120.htm" title="移动端页面侧边导航滑入效果" target="_blank">移动端页面侧边导航滑入效果</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascirpt/1.htm">javascirpt</a> <div>效果体验:http://hovertree.com/texiao/mobile/2.htm可以使用移动设备浏览器查看效果。效果使用到jquery-2.1.4.min.js,该版本的jQuery库是用于支持HTML5的浏览器上,不再兼容IE8以前的浏览器,现在移动端浏览器一般都支持HTML5,所以使用该jQuery没问题。HTML文件代码: <!DOCTYPE html> <h</div> </li> <li><a href="/article/3247.htm" title="AspectJ+Javasist记录日志" target="_blank">AspectJ+Javasist记录日志</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/aspectj/1.htm">aspectj</a><a class="tag" taget="_blank" href="/search/javasist/1.htm">javasist</a> <div>在项目中碰到这样一个需求,对一个服务类的每一个方法,在方法开始和结束的时候分别记录一条日志,内容包括方法名,参数名+参数值以及方法执行的时间。   @Override public String get(String key) { // long start = System.currentTimeMillis(); // System.out.println("Be</div> </li> <li><a href="/article/3374.htm" title="redis学习笔记" target="_blank">redis学习笔记</a> <span class="text-muted">MJC410621</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>1)nosql数据库主要由以下特点:非关系型的、分布式的、开源的、水平可扩展的。 1,处理超大量的数据 2,运行在便宜的PC服务器集群上, 3,击碎了性能瓶颈。 1)对数据高并发读写。 2)对海量数据的高效率存储和访问。 3)对数据的高扩展性和高可用性。 redis支持的类型: Sring 类型 set name lijie get name lijie set na</div> </li> <li><a href="/article/3501.htm" title="使用redis实现分布式锁" target="_blank">使用redis实现分布式锁</a> <span class="text-muted">qifeifei</span> <div>在多节点的系统中,如何实现分布式锁机制,其中用redis来实现是很好的方法之一,我们先来看一下jedis包中,有个类名BinaryJedis,它有个方法如下:   public Long setnx(final byte[] key, final byte[] value) { checkIsInMulti(); client.setnx(key, value); ret</div> </li> <li><a href="/article/3628.htm" title="BI并非万能,中层业务管理报表要另辟蹊径" target="_blank">BI并非万能,中层业务管理报表要另辟蹊径</a> <span class="text-muted">张老师的菜</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/BI/1.htm">BI</a><a class="tag" taget="_blank" href="/search/%E5%95%86%E4%B8%9A%E6%99%BA%E8%83%BD/1.htm">商业智能</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8C%96/1.htm">信息化</a> <div>       BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP、CRM、SCM、进销存、HER、OA等。        BI系统不同于传统的管理信息系统,他号称是一个整体应用的解决方案,是融入管理思想的强大系统:有着系统整体的设计思想,支持对所有</div> </li> <li><a href="/article/3755.htm" title="安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题" target="_blank">安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>1.在~/.bashrc最后加入 [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"  2.重新启动terminal输入:   rvm use ruby-2.2.1 --default  把当前安装的ruby版本设为默</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>