我知道标题可能有点难以理解,但我会尽力在这里解释我需要什么。在这里,我将首先向您提供我的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." ";
}
?>
答案 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"
}
}