2011-02-28 9 views
6

私はXPathの世界では初めてです。私はデータベースの代わりに私の単純なポートフォリオのWebサイトを動かすために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でのフィルタリングプロジェクトについて行くのですか?たとえば、e-commerceの値を持つノードprojectTypeがあるすべてのprojectノードを取得するにはどうすればよいですか? XPathの同等物は何だろう

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

通常、私のようなSQLクエリを実行するのでしょうか?私のXMLファイルは、このフィルタリングに適した構造になっていますか?

すべてのポインタが優れています。前もって感謝します。

+0

はおそらく、質問に関係のない、しかし、あなたの目的に、あなたはsqliteのを使用して検討していますか?データベースエンジンは、アプリケーションと同じプロセススペースで初期化され、データベースファイルは「* .db」形式で格納されます。 SqliteにはPHPバインディングがあり、他のデータベースエンジンと同じようにSQL文を送ることができます。 –

+0

@de costo - 私は次の人と同じようにSQLiteが大好きですが、トピックは完全にオフです...今はsqliteを使用していないことをどのように知っていますか? –

+0

@Byron - ファイルを保存する著者のオプションとして推奨されます。私の意見では、情報を格納するために.dbファイルを持つものをXMLファイルにする必要はありません。 –

答えて

6

に等しい string-valueあなたのxmlファイル名を考慮しfoo.xmlで、バーの同じディレクトリにあります。コンテンツ

$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. 
    } 
} 

または任意の場所をダブルスラッシュすなわち//nodeYouWantとドキュメントの接頭辞でノードを選択するには、純粋なXPathの

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

いくつかのポインタ

を使用。属性を選択するには@、つまり/nodeName[@attribute='attributeValue']の構文を使用します。

+0

XPathにp/1 'contains()'関数がありません。 –

+0

@Alejandro - 正しい、更新されました。 –

0

W3schoolsは、開始するのに適しています。

私はおそらくプロジェクトの属性にprojectTypeを変更してから、次のように選択します:

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

:それは、XML文書でXPathを使用して、非常に良いリソースを持っている

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

をするXPath(http://www.w3.org/TR/xpath/#predicates)のドキュメントでは、この例があります:

chapter[title="Introduction"] は、一つ以上の title子を持つ コンテキストノードのchapter子供を選択します Introduction

+0

スキーマがよく知られているときに '/'演算子を開始する必要はありません。 –

+0

+1仕様の引用用です。 –

7

を持っているPHPは私はあなたがこれをしたいと考えている:

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

[]フィルターは私も見つけた値"e-commerce"

projectType子を持つprojectsの下にあるすべてのproject要素を選択しますthis siteは、XPathとXSLTのクエリを混乱させるのに非常に役立ちます。

さらに読書:http://www.w3schools.com/xpath/xpath_syntax.asp

+0

+1非常にいい.... –

+0

+1正解。 –

関連する問題