Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Xpath查找具有特定子元素的XML节点_Php_Xml_Xpath - Fatal编程技术网

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

Php 使用Xpath查找具有特定子元素的XML节点,php,xml,xpath,Php,Xml,Xpath,我不熟悉XPath的世界。我希望采用XML方法来为我的简单投资组合网站提供支持,而不是数据库,在这种情况下,数据库是多余的,因为唯一的数据库元素是项目本身 我编写了一个具有以下结构的XML文件: <?xml version="1.0" encoding="UTF-8" ?> <projects> <project> <title>A-Merchandise</title> <slug>

我不熟悉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>
    ...
XPath的等价物是什么?我的XML文件的结构是否适合这种过滤


任何指点都很好。提前感谢。

学习xpath,它非常有用。虽然我总体上不喜欢W3C学校,但它们都很不错

$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']
语法。

是一个很好的起点

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

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

您可以使用XPath文件管理器,如下所示:

//project[projectType='E-commerce']
在XPath()的文档中,有以下示例:

章节[title=“引言”]
选择主题的
章节
子项 具有一个或多个上下文的上下文节点
标题
有 等于
简介


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

我相信你想要这个:

/projects/project[projectType="e-commerce"]
[]
过滤器选择
项目
下的所有
项目
元素,这些元素有一个
项目类型
子元素,其值为
“电子商务”

我还发现,这对于处理XPath和XSLT查询非常有帮助


进一步阅读:

可能与问题无关,但出于您的目的,您是否考虑过使用sqlite?数据库引擎在与应用程序相同的进程空间中初始化,数据库文件以“*.db”格式存储。Sqlite具有PHP绑定,您可以像发送任何其他数据库引擎一样发送SQL语句。查看此链接:@de costo-我和下一个家伙一样喜欢SQLite,但完全脱离主题。。。你怎么知道他现在没有使用sqlite?@Byron-建议作为作者存储文件的选择。在我看来,应该没有必要使用XML文件来存储信息。@de costa-你是对的,我没有意识到是他编写了XML文件。我收回我以前的评论!哇!我只想在这么短的时间内感谢所有有用的答案。不幸的是,我只能选择一个答案作为正确答案,但有不止一个答案对我非常有帮助。感谢大家。当模式众所周知时,无需启动
/
操作符。
/projects/project[projectType="e-commerce"]