2010-03-18 88 views
0

我有一个元素的id属性值。帮助使用XPath选择

我只需要选择其子女(不是所有的后代)。

我用

$childElements = $xml->xpath('//entity[@id=212323]'); 
print_r($childElements); 

但会选择所有后代并打印出来。我只想选择1代的孩子。我怎么能这样做?

<entity id=212323> 
    <this>asd</this> 
    <this>asd</this> 
    <this>asd</this> 
    <this> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
    </this> 
</entity> 

(导致层次是很长,所以fecthing所有后代将减缓过程下来,它不是智能抓取不必要的数据)。

+1

位在黑暗中刺,但是这可能我朝着正确的方向迈出的一步:'//实体[@ ID = 212323] /儿童:: * /文()'或'也许//实体[@ id = 212323]/child :: */child :: text()' – 2010-03-18 01:53:14

+0

不,它仍然提取id元素下的每个元素。 – 2010-03-18 01:55:47

+2

我想你是误会。当你打印一个元素时,你打印它的所有子元素,对吧?即使您只选择顶级儿童,如果您打印它们......您也可以打印所有内容。你需要重新考虑你的要求。 – Cheeso 2010-03-18 03:50:55

回答

4

您可以使用此:

//entity[@id=212323]/child::*[not(boolean(child::*))] 

只选择那些没有孩子的节点。如果这不够好,你也期望像这样的情况:

<entity id=212323> 
    <this>asd</this> 
    <this>asd</this> 
    <this>asd</this> 
    <this> 
     text node 1 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     text node 2 
    </this> 
</entity> 

你应该做更多的研究。在这个例子中text node 1text node 2被认为是<this>元素的儿童。您需要找出(我不确定是否有可能)如何在xPath表达式中将这两个节点与其他节点(如<notThis>asd</notThis>)区分开来。