欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

QueryPath, php上的jQuery

系統 3070 0

?

?

紅得發紫的jQuery框架是專門用于頁面Javascript程序設計的,它通過一種優雅的方式讓我們輕松自如地操作頁面的所有元素而無須擔心瀏 覽器版本以及兼容性等問題。受到jQuery的啟發,一種試圖讓Web開發者在PHP中直接采用jQuery方式操縱和生成HTML/XML元素的 QueryPath計劃開始了,庫的發開者是 Matt Butcher

?

QueryPath可以很方便地讀入和生成HTML/XML,使用jQuery類似的語法和函數遍歷文檔對象,支持遠程URL文件的讀取和分析。支 持標準的CSS3 Selector和XPath,這意味著我們可以使PHP像jQuery一樣,隨心所欲地玩轉任何HTML!當然PHP5本身就帶了不少DOM解析 庫,QueryPath本身也是在這些庫上的二次加工,省下了我們不少的工作量。

QueryPath官方網站: http://querypath.org/

?

QueryPath使用一個qp()工廠函數,為各種需求生成不同的類,一個最簡單的例子如下:

?

    require 'QueryPath/QueryPath.php'; 
$html = qp('a.html');
$html->find('title')->text('hello world');
$html->find('.myInput')->attr('value', 'hello world');
$html->find('body')->css('background-color', 'red');
  
?

如果你對jQuery熟悉的話,幾乎可以沒有任何學習成本就能很快上 手。我立刻就使用QueryPath來寫了幾個測試例程,分析和遍歷了一個常去的網站的內容結構,抓取了和分析了不少有用的資料。感覺對于那些做網站采集 程序的家伙們來說,QueryPath是不是又要讓他們更加如魚得水(抑或是無惡不作)了,LOL。

?

使用過程中發現QueryPath庫尚處于基本的開發狀態,不少問題。但對于程序員來說,遇到問題讀一下庫的源代碼,基本上就能搞定。下面列出兩個 常用問題的解決,與大家分享。

?

1.當QueryPath查詢到一個節點并操作完成后,它本身并不回到根節點,而是停留在節點上,不知道這樣描述正確否,這樣導致的結果是下一步的 查詢將很可能找不到數據。解決的方法是用top()函數回到根節點。如上面的例子可以直接這樣用,用top回到根:

?

    $html->top()->find('.myInput')->attr('value', 'hello world');
  
?

支持的方法有top(), prev(), next(), child(),不用解釋,很好理解。

?

?

2.無法讀取遠程url,或不能識別非"html"的擴展名的html文件。QueryPath直接分析文件和url的擴展名,不為"html"的直接當做xml處理,寒一個。解決的辦法是用url的傳遞參數在最后面偽裝一 個".html"的參數,告訴QueryPath這是HTML文件。解決方法:

?

    $qp('http://www.acwind.net/index.php?=.html');//偽裝一個后綴名,搞定。
  
?

希望開發者能在將來的版本中改進,能自動識別文件類型那該多好。


詳解:

?

PHP 也曾在 Web 開發領域造成轟動。由于易于開發和以 Web 為中心的模型,PHP 使 Web 站點從小小的主頁變成像 Yahoo! 這樣強大的站點。但是,通過 PHP 來使用這三種技術 — 尤其是 XML — 有時候會比較復雜。在本文中,了解 QueryPath,這是一個 PHP 庫,它在設計時考慮了兩個目標:

  • 簡單性,使 HTML、XML 和 HTTP 變得容易使用
  • 健壯性,為使用這些技術提供豐富的工具

本文探索如何構建 QueryPath 對象、遍歷 XML 和 HTML、操縱 XML 和 HTML 以及使用 QueryPath 訪問 Web 服務(使用 Twitter 作為示例服務)。

?


剖析 QueryPath 鏈

?

對于 QueryPath 的典型使用,有四個最重要的概念:

  • QueryPath 對象與一個 XML 或 HTML 文檔相關聯。
  • QueryPath 可以查詢文檔,識別文檔中的一組匹配項。
  • QueryPath 可以操縱文檔。可以添加新的部分,修改已有的部分,刪除不想要的部分。
  • QueryPath 方法可以鏈接在一起,在一個簡潔的序列中執行很多操作。只需幾行代碼,就可以裝載、解析、查詢、修改和寫入文檔。

清單 1 中的代碼展示了所有這些要點。


清單 1. 基本的 QueryPath 鏈

?

    <?php
require 'QueryPath/QueryPath.php';
qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>
  
? ?

以上例子需要一個庫,即 QueryPath/QueryPath.php 。除非還要裝載 QueryPath 擴展,否者只需包括這個庫就可以使用 QueryPath。

PHP 對象語法
具有面向過程編程背景的 PHP 開發人員可能不熟悉 PHP 的面向對象語法。一個對象可能有一些附屬的函數。這些函數稱作 方法(method) 。可以通過 對象操作符 (->)調用 對象的方法。

例子中接下來一行代碼是一個 QueryPath 鏈,它做以下事情。

  1. 創建一個新的 QueryPath 對象,該對象指向 sample.html 文檔。當 qp() 運行時,它將創建一個新的 QueryPath 對象,后者隨即裝載和解析文檔。
  2. 使用 find() 方法,它使用 CSS 3 選擇器 title 搜索整個文檔,尋找所有 <title/> 元素。

    在一個有效的 HTML 文檔中,該搜索只能在文檔的頭部找到一個匹配的 <title/> 元素。

  3. 標題的文本值被設為 Hello World 。當執行到這里時,標題的子節點將被 CDATA(字符數據)字符串 Hello World 替換。任何已有的內容將被破壞。
  4. 使用 writeHTML() 方法將整個文檔寫到標準輸出中。

以上例子實際上還可以縮短一點,因為 qp() 工廠函數帶有一個 CSS 選擇器作為可選的第二個參數。清單 2 顯示了縮短后的版本。


清單 2. 基本的 QueryPath 鏈縮短后的版本

?

            <?php
require 'QueryPath/QueryPath.php';

qp('sample.html', 'title')->text('Hello World')->writeHTML();
?>
          
?

?

假設 sample.html 是一個最基本的 HTML 文檔,以上代碼( 清 單 1 或清單 2)的結果看上去將如清單 3 所示。加粗的行包含我們設置的標題。


清單 3. 生成的 HTML 的例子

?

            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
	<title>Hello World</title>

</head>
<body>
</body>
</html>
          
?

?

這些簡單的例子展示了 QueryPath 可以執行的一些常見的任務。接下來幾個小節探索一些方法。然后,您將把這些構建塊裝配起來,創建一個簡單的 Web 服務客戶機。

?

qp() 工廠函數

?

QueryPath 庫中最常用的函數是 qp() 工廠函數。實際上,它執行創建新的 QueryPath 對象的任務。它被用于傳統的構造函數。

?

如果您熟悉面向對象設計模式,那么可能會意識到 qp() 是工廠模式的一個變種。 QueryPath 不是用構造器方法定義一個工廠類,而是使用一個函數。這種方法除了可以節省鍵盤輸入外(在鏈接方法時比較重要),還可以使 QueryPath 更貼近 jQuery,減少 jQuery 熟悉者的學習曲線。

?

一個 QueryPath 對象與一個 XML 或 HTML 文檔相關聯。當構造 QueryPath 對象時,文檔被綁定到該對象。 qp() 函數帶有 3 個參數,這 3 個參數都是可選的:

一個文檔
可以是一個文件名或 URL、一個 XML 或 HTML 字符串、一個 DOMDocument 或 DOMElement、一個 SimpleXMLElement 或者一個 DOMElement 數組。如果不為該參數提供任何值,QueryPath 將創建一個空白的 XML 文檔,供后面進行操縱。

一個 CSS3 選擇器
如果提供了該參數,在裝載文檔時,QueryPath 將使用給定的選擇器查詢那個文檔。

一個關聯的選項數組
為這個特定 QueryPath 實例提供一種傳遞一組復雜配置參數的方法。API 參考詳細列出了這里可以傳遞的選項。
XML 還是 HTML?
QueryPath 既可以處理 XML,也可以處理 HTML,但這兩種格式有些區別。 QueryPath 試圖自動檢測所使用的格式,并作出相應的調整。XHTML(用 XML 實現的 HTML)被視作 XML。

qp() 支持將很多類型的數據作為第一個參數,從而方便構建 QueryPath 對象。QueryPath 可以以一個文件名或 URL 開始,然后裝載一個文檔。如果傳遞的是一個 XML 或 HTML 字符串,QueryPath 將解析該內容。當然,它可以接受另外兩種常用的 XML 文檔的對象表示:DOM 和 SimpleXML。清單 4 展示 qp() 函數如何解析包含 XML 的字符串。


清單 4. 從 XML 字符串構建 QueryPath 對象

?

            <?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?><doc><item/></doc>';
$qp  = qp($xml);
?>
          
?

?

當清單 4 中的代碼運行時, $qp 將引用一個 QueryPath 對象,該對象在內部指向 XML 解析后的表示。前面的例子傳入的是一個文件名。如果 PHP 被配置為允許 HTTP/HTTPS 流包裝器(在大多數 PHP V5 發行版中是標準配置),那么甚至可以裝載遠程 HTTP URL,如下所示。


清單 5. 從 URL 構建 QueryPath 對象

?

            <?php
require 'QueryPath/QueryPath.php';

$qp = qp('http://example.com/file.xml');
?>
          
?

?

這樣便可以使用 QueryPath 訪問 Web 服務。(可以使用第 3 個參數 qp() 傳遞流上下文,以便對連接設置進行調整)。當創建新文檔時,有一個添加樣板 HTML 的快捷方式,如下所示。


清單 6. 使用 QueryPath::HTML_STUB 常量

?

            <?php
require 'QueryPath/QueryPath.php';

$qp = qp(QueryPath::HTML_STUB);
?>
          
?

?

QueryPath::HTML_STUB 常量定義一個基本的 HTML 文檔,如下所示。


清單 7. QueryPath::HTML_STUB 文檔

?

            <?xml version="1.0"?>
<!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>Untitled</title>
</head>
<body></body>
</html>
          
?

?

以這個框架文檔為基礎,可以更快地生成 HTML。

至此,您知道了如何創建新的指向文檔的 QueryPath 對象,并且看到了一個簡單的 CSS 選擇器。下一小節討論如何使用 QueryPath 遍歷文檔。

?

遍歷文檔

?

打開文檔后,需要在文檔中查找感興趣的內容。QueryPath 的設計使得這一任務變得很容易。為了簡化遍歷需求,QueryPath 提供了一些用于遍歷的方法。大多數方法使用 CSS3 選擇器查找所需的節點。


圖 1. 重要的 QueryPath 遍歷方法
重要的 QueryPath 遍歷方法

圖 1 總結了常用的遍歷函數。下面一一描述每個函數。雖然還有一些遍歷函數沒有提到,但這里覆蓋了大多數常見的需求。

?

表 1. 常見遍歷方法

方法 描述 是否帶 CSS 選擇器
find() 選擇與選擇器匹配的任何元素(在當前選擇的節點下)
xpath() 選擇與給定 XPath 查詢匹配的元素 否(使用 XPath 查詢)
top() 選擇文檔元素(根元素)
parents() 選擇任何祖先元素
parent() 選擇直接父元素
siblings() 選擇所有同胞(sibling)元素(包括之前和之后的元素)
next() 選擇后一個同胞元素
nextAll() 選擇當前元素之后的所有同胞元素
prev() 選擇前一個同胞元素
prevAll() 選擇當前元素之前的所有同胞元素
children() 選擇當前元素的直接子元素
deepest() 選擇當前元素下最深的節點

?

QueryPath 中的很多方法可以以查詢作為參數,進一步指定應該選擇什么項。如表 1 中第三列所示,幾乎所有這些方法都帶有一個作為可選參數的 CSS3 選擇器。( xpath() 函數則帶有一個 XPath 查詢,而不是 CSS3 選擇器)。只有 top() deepest() 不使用查詢作為參數。

可以通過另一個簡單的例子了解如何進行遍歷。假設有一個像下面這樣的 XML 文檔。


清單 8. 一個簡單的 XML 文檔

?

            <?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>            
          
?

?

<root/> 元素有 4 個子元素:其中有 3 個名為 <child/> ,還有一個名為 <ignore/> 。可以用一個 QueryPath 查詢選擇 <root/> 的所有 4 個子元素。


清單 9. 選擇所有子元素

?

            <?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>';

$qp = qp($xml, 'root')->children();
print $qp->size();
?>
          
?

?

children() 方法將選擇 <root/> 元素的所有直接子元素。最后一行打印 QueryPath 對象中匹配項的數量,最終打印的結果為 4

假設只需選擇 3 個 <child/> 元素,而不需要選擇 <ignore/> 元素。 清單 10 顯示了如何實現這一點。


清單 10. 使用過濾器的查詢

?

            <?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

print $qp->size();
?>
          
?

?

最后的 print 語句將打印 QueryPath 當前選擇的項的數量。它將返回 3 。在內部,QueryPath 跟蹤這 3 個元素。它們被存儲為當前上下文。如果執行進一步的查詢,那么查詢將從這 3 個元素開始。如果試圖附加數據,那么數據將被附加到這 3 個元素后。

CSS 選擇器

CSS 屬性
CSS3 選擇器將一些屬性視作專用屬性。 id class 屬性都有專用的選擇器語法。與其他 XML 技術不同,XML DTD 或模式不需要將這些屬性指定為專用屬性。這些屬性仍是由 CSS3 選擇器引擎處理。

CSS 選擇器是 CSS 語句的一部分,用于選擇將應用某種樣式的元素。CSS 選擇器還可以在樣式表上下文之外使用。QueryPath 使用選擇器作為查詢語言,并支持 CSS3 選擇器 標 準 中描述的特性集。

CSS 選擇器在 QueryPath 中扮演很重要的角色。您已經看到,有 10 個函數使用 CSS 選擇器作為參數。到目前為止使用的選擇器是簡單的標記名查詢。CSS3 選擇器要比前面的例子強大得多。對 CSS3 選擇器的詳細描述超出了本文的范圍,但表 2 提供了一些常見的選擇器模式的例子。


表 2. 常見的 CSS3 選擇器模式

選擇器模式 描述 示例匹配項
p 找到標記名為 <p/> 的元素 <p>
.container 找到 class 屬性被設為 container 的元素 <div class="container"/>
#menu 找到 id 屬性被設為 menu 的元素。基于 ID 的搜索以這種方式進行 <div id="menu"/>
[type="inline"] 找到 type 屬性的值為 inline 的元素 <code type="inline"/>
tr > th 找到直接父元素為 <tr> <th> 元素 <tr><th/></tr>
table td 找到祖先(例如父親或祖父)中有 <table> 元素的 <td> 元素 <table><tr><td/></tr></table>
li:first 獲取第一個名為 <li/> 的元素。支持的偽類包括 :last :even :odd <li/>
RDF|seq 找到 <RDF:seq> 元素。 QueryPath 包括用于 XML 名稱空間的 CSS3 選擇器。名稱空間支持延伸到屬性和元素 <RDF:seq>

?

這些常見的選擇器模式可以加以組合,形成復雜的選擇器,例如

?

            div.content ul>li:first
          
?


。 這個選擇器將搜索 class 為 content 的任何 <div/> 。 在 div 中,它將搜索所有無序列表( <ul> ),返回每個列表的第一個列表項( <li> )。

?

迭代匹配項

?

您了解了遍歷文檔的兩個方面:QueryPath 提供的方法和 CSS3 選擇器支持。第三個方面是迭代選擇的項。

QueryPath 對象是 可遍歷的(traversable) 。在 PHP 中,這意味著對象可以當做迭代器。標準的 PHP 循環結構可以遍歷 QueryPath 對象選擇的元素。還記得嗎, 清 單 10 中的例子是一個簡單的查詢,它從一個 XML 文檔中檢索 3 個元素。接下來的例子將以這個例子為基礎。

如果要單獨處理每個項,應該怎么辦?很容易,因為 QueryPath 可以用作迭代器。清單 11 顯示了一個例子。


清單 11. 迭代選擇的元素

?

            <?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

foreach ($qp as $child) {
  print $child->attr('id') . PHP_EOL;
}
?>
          
?

?

foreach 循環迭代時,它將每個匹配項賦給 $child 變量。但是, $child 不是真正的元素,它是指向當前元素的一個 QueryPath 對象。您可以任意使用所有常見的 QueryPath 方法。

?

為了使 API 與 jQuery 的 API 類似, QueryPath 提供一些可同時作為 accessor 和 mutator — 或 getter 和 setter 的方法。取決于參數,同一個方法可以檢索(access)數據,或者更改(mutate)數據。 attr() 函數就是一個例子。

?

qp()->attr('name') 檢索 name 屬性的值。 qp()->attr('name', 'value') name 屬性的值設為 value 。還有一些方法,包括 text() html() xml() ,作為 accessor 和 mutator 同時執行兩種任務。

?

由于每個迭代的項包裝在一個 QueryPath 對象中,所以可以通過 $child 任意使用所有標準的 QueryPath 方法。上面的例子使用了 attr() 函數,這是一個元素中的屬性的 accessor 和 mutator。

attr() 方法檢索名為 id 的屬性的值。下面顯示以上代碼的輸出。


清單 12. 清單 11 中迭代器例子的輸出

?

            one
two
three
          
?

?

您已經了解了如何使用 QueryPath 方法、CSS3 選擇器和迭代技術遍歷文檔。下一節探索如何用 QueryPath 修改文檔。

?

操縱文檔

?

除了使用 QueryPath 搜索文檔外,還可以使用它添加、修改和移除文檔中的數據。在清單 1 中可以大致了解 QueryPath 的功能。為了方便,下面再重復一遍。


清單 13. 基本的 QueryPath 鏈

?

            <?php
require 'QueryPath/QueryPath.php';

qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>
          
?

?

在這個例子中, text() 函數用于修改 <title/> 元素的內容。QueryPath 提供了十幾個用于更改文檔的方法。圖 2 展示一些常用的修改方法如何工作。這些方法都是添加或替換數據。綠色的標記表示當前被選中的元素。


圖 2. 用于添加或替換內容的 QueryPath 方法


用于添加或替換內容的 QueryPath 方法

每個方法以字符串數據(通常是以 HTML 或 XML 片段的形式)作為參數,并將數據插入到文檔中。隨后立即可以訪問和進一步操縱新插入的數據。

?

使用 HTML 和 XML 片段

實際上有兩類方法。第一類方法使用任意的 XML 片段,如下所示。

append() 將數 據添加為當前選中元素的 最后一個 子元素
prepend() 將 數據添加為當前選中元素的 第一個 子元素
after() 將 數據直接插在當前選中元素 之后
before() 將數據直接插在當前選擇的元素 之前
html() 替換 HTML 文檔中當前元素的子內容
xml() 替換 XML 文檔中當前元素的子內容

?

以上方法需要一個參數,該參數包含一個格式良好的 XML 或 HTML 數據的字符串。清單 14 有一個使用 html() 方法的例子。


清單 14. 基本的 QueryPath 鏈

?

            <?php
require 'QueryPath/QueryPath.php';

qp($file)->find('div.content')->html('<ul><li>One</li></ul>');
?>
          
?

?

圖 2 中沒有給出 remove() 方法(難以清楚地表示移除)。 remove() 方法移除文檔中的元素。如果不帶參數調用,該方法將移除當前選中的元素。但是,和很多其他的 QueryPath 方法一樣, remove() 可以使用一個 CSS3 選擇器作為可選參數。如果提供了一個選擇器,那么只移除與選擇器匹配的項。

?

使用屬性

圖 2 中的第二類方法則操縱元素中的屬性。下面介紹兩個這樣的例子。

attr() 獲取或設 置每個選中的元素上給定屬性的值
addClass() 為當前選中的每 個元素添加一個類

?

還有其他一些與屬性相關的方法。例如 removeClass() 方法,該方法以一個類名作為參數,它將移除元素中的一個類。 removeAttr() 以一個屬性名作為參數,它將從所有當前選中的元素中移除具有該名稱的屬性。

現在可以將所有這些基本功能組合到一起,形成有趣的東西。

?

示例:用 QueryPath 搜索 Twitter

?

Twitter 是一個流行的微博客服務,通過它可以發布短消息,同時還可以跟隨其他 Twitter 用戶的微博客。 Twitter 提供了一個簡單的 Web 服務,用于公布該平臺的很多特性。

?

下面的例子使用 QueryPath 在 Twitter 服務器上執行搜索,并以 HTML 格式打印結果。可以將一個工具添加到已有的 Web 站點,以顯示最近的關于一個感興趣的話題的 Twitter 活動。

?

Twitter 的搜索服務器偵聽一個標準的 HTTP 服務器,當被請求時,以 Atom XML 格式返回搜索結果。我們的例子將搜索最近 5 個提到 QueryPath 的貼子。為了運行這種搜索,并以 Atom 格式返回內容,只需在 URL 中編寫必要的信息: http://search.twitter.com/search. atom ? rpp=5 & q=QueryPath

加粗的 3 個部分表示針對這個應用程序進行了調整的參數。

?

.atom 提供這個擴 展名是為了告訴服務器需要返回 Atom XML 內容
rpp=5 RPP 指定每頁顯示的結果數。我們想要返回 5 條結果。默認情況下,將返回 5 條最近的結果
q=QueryPath 這 是查詢。Twitter 支持更復雜的搜索查詢,但對于這個簡單的例子只需要這樣的查詢。

?

當裝載這個 URL 時,Twitter 將返回一個 Atom 格式的 XML 文檔。下面的清單 15 顯示一個經過大量簡化的返回文檔。這里只顯示最關心的信息(只顯示一個條目)。


清單 15. Twitter 搜索返回的 XML 的摘錄

?

            <?xml version="1.0" encoding="UTF-8"?>
<feed>
  <entry>
    <content type="html">
       Last night I added XSD schema validation and XSL
       Transformation (XSLT) support to &lt;b&gt;QueryPath&lt;/b&gt; (as
       extensions). Will commit them today.
    </content>
    <link type="image/png" rel="image" />
    <author>
      <name>technosophos (M Butcher)</name>
      <uri>http://twitter.com/technosophos</uri>
    </author>
  </entry>
</feed>
          
?

?

清單 16 顯示了執行搜索的簡要的 QueryPath 代碼,處理返回的 XML,并創建一個文檔。


清單 16. 用 QueryPath 處理返回的 XML

?

            <?php
require 'QueryPath/QueryPath.php';

$url = 'http://search.twitter.com/search.atom?rpp=5&q=QueryPath';
$out = qp(QueryPath::HTML_STUB, 'body')->append('<ul/>')->find('ul');

foreach (qp($url, 'entry') as $result) {
  $title = $result->children('content')->text();
  $img = $result->siblings('link[rel="image"]')->attr('href');
  $author = $result->parent()->find('author>name')->text();
  $out->append("<li><img src='$img'/> <em>$author</em><br/>$title</li>");
}
$out->writeHTML();
?>
          
?

?

如果使用 Web 瀏覽器執行以上代碼,可以看到圖 3 所示的結果。


圖 3. QueryPath 顯示 Twitter 搜索結果


QueryPath 顯示 Twitter 搜索結果

清 單 16 中的代碼有 14 行,其中只有 9 行代碼做實際的工作。以上代碼是如何產生圖 3 中的視圖的呢?

?

$url 變量存放前面提到的 Twitter URL。 $out 變量指向用于將 HTML 寫到客戶機的 QueryPath 對象。 從一個基本的文檔 ( QueryPath::HTML_STUB )開始,添加一個無序列表,并(使用 find() ) 選擇這個新列表。

?

foreach 循環是腳本中最重要的一行: foreach (qp($url, 'entry') as $result) 。這里創建 一個新的 QueryPath 對象。由于傳遞了一個 URL,QueryPath 將檢索遠程 Atom 文檔,并解析結果。另外,由于傳遞了選擇器 entry ,QueryPath 將選擇文檔中的所有條目。回頭查看一下 清 單 15 ,看看這是文檔中的哪個部分。返回的文檔中將有 5 個條目(因為 URL 中這樣設置了 rpp 標志)。這 5 個條目中的每個條目看上去都應該與清單 15 中的 <entry/> 類似。

?

循環獲取了 3 個數據部分:

$title 條目的內 容
$img 發帖用戶的頭像的 URL
$author 發 帖用戶的用戶名

?

為了獲取每塊數據,可以使用不同的 QueryPath 方法。例如,可以使用 $result->children('content')->text(); 獲得 $title

?

使用 text() html() xml() 訪問內容
您看到了如何使用 text() 設置文本( 清 單 1 )。 清 單 16 中則使用該方法 獲取 信息。 text() 函數將返回所有文本內容,但是不包括元素或其他節點類型。如果要獲得所有內容,可以使用 xml() ,對于 HTML 文檔,則可以使用 html()

循環中首先選擇標記名為 content 的所有子元素,然后從發現的節點中獲得 CDATA 文本。每個條目將有一個 <content/> 元素。

?

現在需要獲得圖像 URL。在前面的鏈中,選擇了 <content/> 元素,所以這就是起點。現在需要搜索 <content/> 的同胞,找到形如 <link rel="image"/> 的元素。 為此,使用 siblings() 函數,并提供一個選擇器作為參數。然后使用 attr() 函數獲得元素的 href 屬性的值。

?

最后,從 <link/> 元素跳回到它的父元素,接著使用 find('author>name') , 獲得作者的用戶名。(請查看 表 2 )。在這里,可以使用 text() 獲得作者的用戶名的文本。

?

foreach 循環的每次迭代的最后,構建一個 HTML 片段,并使用 append() 將這個片段插入到 $out QueryPath 中。

?

迭代完從 Twitter 返回的結果后,可以在腳本的最后將 HTML 文檔寫到瀏覽器: $out->writeHTML();

這樣就完成了。在大約十幾行代碼中,您完成了與一個遠程服務的交互。可以通過這種方式,使用 QueryPath 訪問任何使用 HTTP 和 XML 或 HTML 的 Web 服務。QueryPath 附帶的例子展示了如何設置連接參數、對 SPARQL 端點執行 SPARQL 查詢以及解析復雜的、多名稱空間的文檔。QueryPath 為使用 Web 服務帶來巨大的潛力。

?

?

結束語

?

在本文中,您探索了 QueryPath 庫的基礎。您學習了如何創建 QueryPath 對象、遍歷文檔和操縱內容。您還構建了一個小型的例子腳本,該腳本使用流行的 Twitter 微博客服務的 Web 服務 API。

?

本文只是初步發掘 QueryPath 庫的一些可能的應用。例如,本文只提到數據庫 API,可使用該 API 將 RDBMS 支持集成到 QueryPath。想象一下,運行一個 SQL SELECT 語句,并將結果直接合并到一個符合自己的規范的 HTML 表格中。或者再想象一下,構建一個 XML 導入器,用于解析數據并將數據直接插入到數據庫中。

?

QueryPath 還有一些特性這里沒有提到。通過映射器和過濾器,可以讓 QueryPath 運行定制的函數來轉換或過濾 QueryPath 數據。通過 QPTPL 擴展,可以將數據插入到預定義的純 HTML 模板中。QueryPath 還支持用戶定義的擴展。通過編寫一個簡單的類定義,可以將自己的方法添加到 QueryPath 中。

?

?

>>phpQuery—基于 jQuery的PHP實現

?

?

?

QueryPath, php上的jQuery


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: av在线一区二区三区 | 成人在线小视频 | 亚洲免费人成在线视频观看 | 一区二区成人国产精品 | 欧日韩不卡在线视频 | 九九热国产在线 | 欧美一区视频 | 一区二区中文 | 精品中文字幕一区二区 | 国产午夜免费视频片夜色 | 无名者电影在线完整版免费 | 国产一区二区三区久久久久久久久 | 日韩一区二区不卡 | 国产高清在线看 | 无人精品乱码一区二区三区 | 日韩欧美福利视频 | 日本午夜精品一区二区三区电影 | 一区二区三区视频免费 | 国产成+人+亚洲+欧美+日韩 | 欧美一区二区大片 | 欧美中文字幕一区二区 | 天天操网 | 日本一区视频在线播放 | 日本一区二区三区免费观看 | 久久精品国产第一区二区 | 五月天婷婷免费观看视频在线 | 国产91色在线 | 亚洲 | 成人精品视频一区二区三区尤物 | 国产精品1区| 日韩久久精品 | 天天搞夜夜爽 | 日韩中文字幕在线播放 | 成年人福利 | 亚洲午夜在线播放 | 午夜看片免费 | 欧美天堂| 午夜视频在线观看视频 | 国产日韩欧美在线观看 | 日本成人一二三区 | 亚洲影视在线 | 国产不卡在线观看视频 |