5
votes

What would be the xpath query to find all child nodes with a specific attribute value, but starting from a node with a specific attribute value?

This is kind of related to a question I posted earlier about parsing an rdf xml file - I thought I had solved it but not quite yet.

For example, I am trying to parse and grab all of the rdf:about attribute values. I have this working fine. I need to add the following condition though - parsing needs to start after a specific rdf:about value is found.

I am working in PHP and and using DomDocument and am using the following xpath query:

$xpath->query('//@rdf:about');

It is finding all rdf:about attributes fine.

I need to extend this to only find those attributes that come after the node whose rdf:about attribute is equal to something.

Hope this makes sense.

2
I saw your previous question and noticed you're using ARC but not its parser, I would seriously suggest using the parser as RDF/XML has a lot of syntactic sugar and XPath which works for one file is not guaranteed to work for another. If you are struggling to understand how to extract data from the parsed structures maybe try using the Graphite library (graphite.ecs.soton.ac.uk) which is a high level abstraction layer over ARC2 - RobV

2 Answers

2
votes
$xpath->query("//*[@rdf:about='http://rdfs.org/sioc/ns#']/following-sibling::*/@rdf:about");

With your sample script, outputs URLs starting/ending with:

http://rdfs.org/sioc/ns#Community
http://rdfs.org/sioc/ns#Container
...
http://rdfs.org/sioc/ns#reference
http://rdfs.org/sioc/ns#subject
1
votes

HI Chris sorry but that isnt quite working for me. If you run my following code:

    $dom = new DomDocument;
$dom->load('http://rdfs.org/sioc/ns#');
$xpath = new DOMXPath($dom);

$elements = array();
foreach($xpath->query('//@rdf:about') as $element) {

    array_push($elements, $element->value);
}

foreach($elements as $element) {

    echo("<br />" . $element);
}

You should get a list of elements in the sioc ontology. The problem is that the first 9 are not actually part of the ontology and so I want to ignore them and start on the 10th node which has 'http://rdfs.org/sioc/ns#' as its value for the rdf:about attribute.

By including your xpath query i get nothing back at all.