2011-02-28 291 views
6

我是XPath世界的新手。我希望採用XML方法來爲我的簡單投資組合網站提供動力,而不是數據庫,在這種情況下,由於唯一的數據庫元素本身就是項目,因此這將是多餘的。使用Xpath查找帶有特定子元素的XML節點

我已經編寫具有以下結構的XML文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<projects> 
    <project> 
     <title>A-Merchandise</title> 
     <slug>a-merchandise</slug> 
     <projectType>E-commerce</projectType> 
     <launchDate>2007-08-01</launchDate> 
    </project> 
    ... 

現在,我可以分析與PHP這個XML文件罰款的列表概述,但我如何去篩選項目的XPath?例如,如何獲取所有project節點的子節點projectType,節點值爲e-commerce

通常情況下,我會像運行SQL查詢:

SELECT * FROM `projects` WHERE `category` = 'e-commerce'; 

會中的XPath相當於是什麼呢?我的XML文件是否在適合此過濾的正確結構中?

任何指針都會很棒。提前致謝。

+0

也許無關的問題,但你的目的,你考慮使用SQLite?數據庫引擎在與應用程序相同的進程空間中初始化,數據庫文件以「* .db」格式存儲。 Sqlite具有PHP綁定,您可以像發送其他數據庫引擎一樣發送SQL語句。檢查這個鏈接: – 2011-02-28 19:06:05

+0

@de costo - 我喜歡SQLite和下一個人一樣,但完全脫離主題......你怎麼知道他現在沒有使用sqlite? – 2011-02-28 19:08:41

+0

@Byron - 建議作爲作者選擇存儲文件的目的。在我看來,應該沒有必要使用XML文件來存儲用於存儲信息的.db文件。 – 2011-02-28 19:15:07

回答

6

考慮您的XML文件名是foo.xml,是酒吧的同一目錄。PHP具有內容

$projects = simpleXMLElement('foo.xml',null,true); 

$ecomProjects = $projects->xpath('project[projectType="E-commerce"]'); 

foreach($ecomProjects as $ecomProject) 
{ 
echo $ecomProject; // or do whatever with it 
} 
2

在xpath上骨化,這是非常有用的。儘管我一般不喜歡w3cshools,但他們的xpath docs相當不錯。

$doc = new DOMDocument(); 
$xpath = new DOMXpath($doc); 

foreach ($xpath->query("/projects/project") as $node) 
{ 
    if ($node->textContent == "e-commerce") 
    { 
    // this node is the one you want. 
    } 
} 

,或者使用純的xpath

foreach ($xpath->query("/projects/project[projectType = 'e-commerce']") as $node) 
    { 
     // grab the $node 
    } 

一些指針

要使用雙斜線即//nodeYouWant在doc前綴的任意位置選擇一個節點。要選擇一個屬性,請使用@,即/nodeName[@attribute='attributeValue']語法。

+0

XPath中沒有p/1'contains()'函數... – 2011-02-28 19:20:51

+0

@Ajjandro - 正確,已更新。 – 2011-02-28 20:08:23

0

W3schools是一個很好的開始。

我可能會改變項目類型爲項目的屬性,然後選擇這樣的:

//project[@projectType ='e-commerce'] 
2

您可以使用XPath文件管理器,像:

//project[projectType='E-commerce'] 

在XPath(http://www.w3.org/TR/xpath/#predicates)的文件,有這個例子:

chapter[title="Introduction"] 選擇 上下文節點的孩子chapter具有一個或多個 title孩子與 string-value等於 Introduction

+0

模式衆所周知時,不需要啓動'//'運算符。 – 2011-02-28 19:21:48

+0

+1用於引用規格。 – 2011-02-28 19:23:42

7

我相信你想這樣的:

/projects/project[projectType="e-commerce"] 

[]過濾器選擇projects下的所有project元素誰擁有projectType孩子價值"e-commerce"

我還發現this site對於解決XPath和XSLT查詢很有幫助。

延伸閱讀:http://www.w3schools.com/xpath/xpath_syntax.asp

+0

+1非常好.... – 2011-02-28 19:19:28

+0

+1正確答案。 – 2011-02-28 19:23:04

相關問題