使用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文件是否在适合此过滤的正确结构中?
任何指针都会很棒。提前致谢。
考虑您的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']
语法。
XPath中没有p/1'contains()'函数... – 2011-02-28 19:20:51
@Ajjandro - 正确,已更新。 – 2011-02-28 20:08:23
您可以使用XPath文件管理器,像:
//project[projectType='E-commerce']
在XPath(http://www.w3.org/TR/xpath/#predicates)的文件,有这个例子:
chapter[title="Introduction"]
选择 上下文节点的孩子chapter
具有一个或多个title
孩子与 string-value等于Introduction
模式众所周知时,不需要启动'//'运算符。 – 2011-02-28 19:21:48
+1用于引用规格。 – 2011-02-28 19:23:42
我相信你想这样的:
/projects/project[projectType="e-commerce"]
的[]
过滤器选择projects
下的所有project
元素谁拥有projectType
孩子价值"e-commerce"
我还发现this site对于解决XPath和XSLT查询很有帮助。
+1非常好.... – 2011-02-28 19:19:28
+1正确答案。 – 2011-02-28 19:23:04
也许无关的问题,但你的目的,你考虑使用SQLite?数据库引擎在与应用程序相同的进程空间中初始化,数据库文件以“* .db”格式存储。 Sqlite具有PHP绑定,您可以像发送其他数据库引擎一样发送SQL语句。检查这个链接: – 2011-02-28 19:06:05
@de costo - 我喜欢SQLite和下一个人一样,但完全脱离主题......你怎么知道他现在没有使用sqlite? – 2011-02-28 19:08:41
@Byron - 建议作为作者选择存储文件的目的。在我看来,应该没有必要使用XML文件来存储用于存储信息的.db文件。 – 2011-02-28 19:15:07