Use Xpath to find XML nodes with a specific child element

10,916

Solution 1

considering your xml file name is foo.xml and is in same dir of bar.php which has content

$projects = simpleXMLElement('foo.xml',null,true);

$ecomProjects = $projects->xpath('project[projectType="E-commerce"]');

foreach($ecomProjects as $ecomProject)
{
echo $ecomProject; // or do whatever with it
}

Solution 2

I believe you want this:

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

The [] filter selects all project elements under projects who have a projectType child with value "e-commerce"

I've also found this site to be very helpful for messing around with XPath and XSLT queries.

Further reading: http://www.w3schools.com/xpath/xpath_syntax.asp

Solution 3

Bone up on xpath, it is very useful. Althought I don't like w3cshools in general, their xpath docs are pretty good.

$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.
   }
}

or using pure xpath

  foreach ($xpath->query("/projects/project[projectType = 'e-commerce']") as $node)
  {
        // grab the $node
  }

Some pointers

To select a node anywhere in the doc prefix with double slashes i.e. //nodeYouWant. To select an attribute use @ i.e. /nodeName[@attribute='attributeValue'] syntax.

Solution 4

You can use XPath filers, like that:

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

In the documentation of XPath ( http://www.w3.org/TR/xpath/#predicates ), there is this example:

chapter[title="Introduction"] selects the chapter children of the context node that have one or more title children with string-value equal to Introduction

Share:
10,916
Martin Bean
Author by

Martin Bean

Updated on June 13, 2022

Comments

  • Martin Bean
    Martin Bean almost 2 years

    I'm new to the world of XPath. I'm wanting to take an XML approach to powering my simple portfolio website instead of a database, which in this case would be superfluous as the only database element would be the projects themselves.

    I've authored an XML file with the following structure:

    <?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>
        ...
    

    Now, I can parse this XML file fine with PHP for a listing overview, but how do I go about filtering projects with XPath? For example, how do I obtain all project nodes that has a child projectType node with the value e-commerce?

    Normally, I would run a SQL query like:

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

    What would the XPath equivalent be? Is my XML file in the right structure to accomodate this filtering?

    Any pointers would be great. Thanks in advance.