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

时间:2011-02-28 18:58:13

标签: php xml xpath

我是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文件是否采用正确的结构来容纳此过滤?

任何指针都会很棒。提前谢谢。

5 个答案:

答案 0 :(得分:7)

我相信你想要这个:

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

[]过滤器会选择projectprojects子项值projectType的所有"e-commerce"元素

我还发现this site非常有助于搞乱XPath和XSLT查询。

进一步阅读:http://www.w3schools.com/xpath/xpath_syntax.asp

答案 1 :(得分:6)

考虑到你的xml文件名是foo.xml,并且在bar.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 :(得分: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']语法。

答案 3 :(得分:2)

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

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

在XPath(http://www.w3.org/TR/xpath/#predicates)的文档中,有一个例子:

  

chapter[title="Introduction"]   选择的chapter个孩子   具有一个或多个的上下文节点   title孩子   string-value等于   Introduction

答案 4 :(得分:0)

W3schools是一个很好的起点。

我可能会将projectType更改为项目的属性,然后选择如下:

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