XML - XPath ---查找与包含特定文本的节点相同的所有节点

时间:2013-11-28 15:03:45

标签: php xml xpath

我知道标题可能有点难以理解,但我会尽力在这里解释我需要什么。在这里,我将首先向您提供我的XML代码。

<stamoudste soort="man">
  <naam>Geert</naam>
  <kind soort="zoon">
    <naam>Kurt</naam>
  </kind>
  <kind soort="dochter">
    <naam>An</naam>
    <kind soort="zoon">
      <naam>Michael</naam>
      <kind soort=" zoon">
        <naam>Bert</naam>
      </kind>
    </kind>
  </kind>
  <kind soort=" dochter ">
    <naam>Nele</naam>
    <kind soort=" dochter ">
      <naam>Paul ine</naam>
    </kind>
  </kind>
</stamoudste>

因为你可以看到有一个名为'An'的'Kind',现在我需要做的就是找到她的同伴。所以,如果选择select.php - An - ,my - selected.php - 应该给我: An有几代人,名字叫:Nele,An,Kurt。

Nele和Kurt与'An'处于同一级别,这些是我需要用XPath找到的,但我不知道如何。我可以找到包含文本“An”的节点,但我需要找到与包含“An”的节点相同的所有节点。

如果你可以帮助我,我会非常高兴,因为我需要这个为考试tomorow。

编辑:

我一直在尝试使用这段代码来阅读它,但它总会给我相同的名字:An,Kurt,Nele。对于An,Kurt和Nele的选择很好,但是对于Michael的选择,它应该回馈Pauline,所以我没有得到它。

<?php
$xml = simplexml_load_file('familie.xml');
//$xPath = $xml->xpath("//naam[count(ancestor::*)=count(//naam[text()='An']/ancestor::*)]");
$xPath = $xml->xpath("//naam[.='".$_GET['naam']."']/ancestor::*");
//$xPath = $xml->xpath("//sibling::naam[.='An']/naam::*");

echo $_GET['naam']." heeft als generatie genoten: ";

foreach($xPath[0]->kind as $kind){
    $kindNaam = $kind->naam;
        echo $kindNaam." ";
}
?>

3 个答案:

答案 0 :(得分:0)

我不知道这是否可以简化,但我会这样做:

//naam[count(ancestor::*)=count(//naam[text()='An']/ancestor::*)]

基本上,您使用以下内容获得An的深度级别:

count(//naam[text()='An']/ancestor::*)

然后你得到的所有naam个节点都具有与上面返回的节点相同的深度级别。

答案 1 :(得分:0)

听起来你想要//kind[namm[.='An']]/naam/text() - 字面上,naam元素中包含的kind元素的文本集包含naam元素,文本值为“一个”。

或者,您可以使用sibling轴://sibling::naam[.='An']/naam/text() - naam元素的文本集,它们是naam元素的兄弟元素,文本值为“An” ”

答案 2 :(得分:0)

使用naam&#34; An&#34;:

选择所有类型的元素

//kind[naam="An"]

这可能超过一个名为&#34; An&#34;的人,因此需要为每个节点完成下一个表达式。

选择前面兄弟姐妹的naam元素:

preceding-sibling::kind/naam

还有以下兄弟姐妹:

preceding-sibling::kind/naam|following-sibling::kind/naam

完整示例:

$xml = <<<'XML'
  <stamoudste soort="man">
  <naam>Geert</naam>
  <kind soort="zoon">
    <naam>Kurt</naam>
  </kind>
  <kind soort="dochter">
    <naam>An</naam>
    <kind soort="zoon">
      <naam>Michael</naam>
      <kind soort=" zoon">
        <naam>Bert</naam>
      </kind>
    </kind>
  </kind>
  <kind soort=" dochter ">
    <naam>Nele</naam>
    <kind soort=" dochter ">
      <naam>Paul ine</naam>
    </kind>
  </kind>
</stamoudste>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$nodes = $xpath->evaluate(
  '//kind[naam = "An"]'
);
foreach ($nodes as $node) {
  $siblingNodes = $xpath->evaluate(
    'preceding-sibling::kind/naam|following-sibling::kind/naam', $node
  );
  $siblings = array();
  foreach ($siblingNodes as $siblingNode) {
    $siblings[] = $siblingNode->nodeValue;
  }
  var_dump(
    array(
      'name' => $xpath->evaluate(
        'string(naam)', $node
      ),
      'siblings' => $siblings
    )
  );
}

输出:

array(2) {
  ["name"]=>
  string(2) "An"
  ["siblings"]=>
  array(2) {
    [0]=>
    string(4) "Kurt"
    [1]=>
    string(4) "Nele"
  }
}