使用Xpath查找带有特定子元素的XML节点

问题描述:

我是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

考虑您的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 
} 

在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

W3schools是一个很好的开始。

我可能会改变项目类型为项目的属性,然后选择这样的:

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

检查此链接了。它在XML文档中使用XPath很好的资源: http://www.w3schools.com/xpath/default.asp

您可以使用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

我相信你想这样的:

/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