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

6

我是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过滤项目呢?例如,如何获取所有具有子节点 projectType 且其值为 e-commerce project 节点?
通常,我会运行类似于以下的SQL查询:
SELECT * FROM `projects` WHERE `category` = 'e-commerce';

请问XPath的等效语句是什么?我的XML文件结构是否适合进行此筛选?

如果您有任何指导意见,将不胜感激。谢谢。


也许与问题无关,但针对您的目的,您是否考虑使用sqlite?该数据库引擎在应用程序的同一进程空间中初始化,并且数据库文件以“*.db”格式存储。Sqlite具有PHP绑定,您可以像任何其他数据库引擎一样发送SQL语句。请查看此链接: - Vishnu Pedireddi
@de costo - 我和其他人一样喜欢SQLite,但这完全不是主题...你怎么知道他现在不在使用SQLite? - Byron Whitlock
@Byron - 建议作为储存文件的选项提供给作者。在我看来,一旦你有了.db文件来储存信息,就不需要XML文件了。 - Vishnu Pedireddi
@de costa - 你是对的,我没有意识到他撰写了 XML 文件。我收回之前的评论! - Byron Whitlock
哇,只想说感谢所有在如此短的时间内提供帮助性答案的人。不幸的是我只能选择一个正确答案,但有多个答案对我非常有帮助。感谢你们所有人。 - Martin Bean
5个回答

7
我相信你需要这个:
/projects/project[projectType="e-commerce"]
[] 过滤器选择 projects 下所有具有值为 "e-commerce"projectType 子元素的 project 元素。
我还发现这个网站对于使用 XPath 和 XSLT 查询非常有帮助。
进一步阅读:http://www.w3schools.com/xpath/xpath_syntax.asp

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

加强对xpath的学习,它非常有用。虽然我总体上不喜欢w3cshools,但他们的xpath文档相当不错。

$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。 要选择属性,请使用@,例如/nodeName[@attribute='attributeValue'] 语法。


2
您可以使用XPath过滤器,例如:
//project[projectType='E-commerce']

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

chapter[title="Introduction"] 选择上下文节点的chapter子元素,它们有一个或多个title子元素,它们的string-value等于Introduction


当模式已知时,无需使用“//”运算符来启动。 - user357812

0

W3schools 是一个不错的起点。

我可能会将 projectType 改为 project 的属性,然后像这样进行选择:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接