我是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 :(得分:7)
我相信你想要这个:
/projects/project[projectType="e-commerce"]
[]
过滤器会选择project
下projects
子项值projectType
的所有"e-commerce"
元素
我还发现this site非常有助于搞乱XPath和XSLT查询。
答案 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)