【问题标题】:Use Xpath to find XML nodes with a specific child element使用 Xpath 查找具有特定子元素的 XML 节点
【发布时间】:2011-07-06 00:02:18
【问题描述】:

我是 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-commerceproject 节点?

通常,我会运行如下 SQL 查询:

SELECT * FROM `projects` WHERE `category` = 'e-commerce';

XPath 等价物是什么?我的 XML 文件的结构是否适合这种过滤?

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

【问题讨论】:

  • 可能与问题无关,但出于您的目的,您是否考虑过使用 sqlite ?数据库引擎在与应用程序相同的进程空间中初始化,并且数据库文件以“*.db”格式存储。 Sqlite 具有 PHP 绑定,您可以像发送任何其他数据库引擎一样发送 SQL 语句。看看这个链接:
  • @de costo - 我和下一个人一样喜欢 SQLite,但完全跑题了......你怎么知道他现在没有使用 sqlite?
  • @Byron - 建议作为作者存储文件目的的选项。在我看来,应该不需要 XML 文件,你有 .db 文件来存储信息。
  • @de costa - 你是对的,我没有意识到他创作了 xml 文件。我收回我之前的评论!
  • 哇。只想在这么短的时间内感谢所有有用的答案。不幸的是,我只能选择一个答案作为正确答案,但对我有帮助的不止一个。谢谢大家。

标签: php xml xpath


【解决方案1】:

W3schools 是一个很好的起点。

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

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

【讨论】:

    【解决方案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
      }
    

    一些提示

    用双斜杠选择 doc 前缀中任意位置的节点,即//nodeYouWant。要选择属性,请使用@,即/nodeName[@attribute='attributeValue'] 语法。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 架构已知时,无需启动//运算符。
      【解决方案4】:

      我相信你想要这个:

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

      [] 过滤器选择 projects 下的所有 project 元素,这些元素的 projectType 子元素的值为 "e-commerce"

      我还发现 this site 对于处理 XPath 和 XSLT 查询非常有帮助。

      延伸阅读:http://www.w3schools.com/xpath/xpath_syntax.asp

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-16
          • 2021-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多