Use Xpath to find XML nodes with a specific child element
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 thechapter
children of the context node that have one or moretitle
children with string-value equal toIntroduction
Martin Bean
Updated on June 13, 2022Comments
-
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 childprojectType
node with the valuee-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.