【问题标题】:XPATH - Select all child nodes with a specific attributeXPATH - 选择具有特定属性的所有子节点
【发布时间】:2011-01-30 02:08:35
【问题描述】:

什么是 xpath 查询来查找具有特定属性值的所有子节点,但从具有特定属性值的节点开始?

这与我之前发布的关于解析 rdf xml 文件的问题有点相关 - 我以为我已经解决了,但还没有完全解决。

例如,我正在尝试解析并获取所有 rdf:about 属性值。我有这个工作正常。我需要添加以下条件 - 解析需要在找到特定的 rdf:about 值后开始。

我正在使用 PHP 并使用 DomDocument 并且正在使用以下 xpath 查询:

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

它可以找到所有 rdf:about 属性。

我需要扩展它以仅查找那些位于其rdf:about 属性等于某物的节点之后的属性。

希望这是有道理的。

【问题讨论】:

  • 我看到你之前的问题并注意到你使用的是 ARC 但不是它的解析器,我会认真建议使用解析器,因为 RDF/XML 有很多语法糖,而适用于一个文件的 XPath 是不保证为他人工作。如果您正在努力理解如何从解析的结构中提取数据,可以尝试使用 Graphite 库 (graphite.ecs.soton.ac.uk),它是 ARC2 之上的高级抽象层

标签: php xml xpath rdf


【解决方案1】:
$xpath->query("//*[@rdf:about='http://rdfs.org/sioc/ns#']/following-sibling::*/@rdf:about");

使用您的示例脚本,输出 URL 开头/结尾为:

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

【讨论】:

  • 太完美了——谢谢。所以只是缺少了来自 Vollerk 建议的星号吗?再次感谢你们(克里斯和沃勒克)
  • 是的,我将其限制为 rdf:Description 元素,但您所追求的值是 owl:Ontology 的属性
【解决方案2】:

嗨,克里斯,对不起,但这对我不太有效。如果你运行我的以下代码:

    $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);
}

您应该获得 sioc 本体中的元素列表。问题是前 9 个实际上并不是本体的一部分,因此我想忽略它们并从第 10 个节点开始,该节点的 rdf:about 属性值为“http://rdfs.org/sioc/ns#”。

通过包含您的 xpath 查询,我什么也得不到。

【讨论】:

  • 对。我误解了你的要求。我已经编辑了我的答案,它似乎适用于您的代码。
最近更新 更多