2013-02-23 110 views
0
<?xml version="1.0" encoding="utf-8" ?> 
<menu> 
    <group Text="Group1"> 
    <item Text="Menu1" /> 
    <item Text="Menu2" Authenticated="0" /> 
    <item Text="Menu3" /> 
    </group> 
    <group Text="Group2" Authenticated="1"> 
    <item Text="Menu4" /> 
    <item Text="Menu5" /> 
    <item Text="Menu6" /> 
    </group> 
    <group Text="Group3" Authenticated="0"> 
    <item Text="Menu7" /> 
    <item Text="Menu8" /> 
    <item Text="Menu9" /> 
    </group> 
</menu> 

在上面的xml中,我想返回所有組元素的子節點(項目元素),但不包括具有屬性驗證的等於 '0'SimpleXMLElement :: xpath(返回包含符合條件的* some *子節點的節點)

結果應該是這樣的:

<group Text="Group1"> 
    <item Text="Menu1" /> 
    <item Text="Menu3" /> 
    </group> 
    <group Text="Group2" Authenticated="1"> 
    <item Text="Menu4" /> 
    <item Text="Menu5" /> 
    <item Text="Menu6" /> 
    </group> 

*編輯:我曾嘗試下面的XPath

/menu/group[not(@Authenticated) or @Authenticated = '1'][item[not(@Authenticated) or @Authenticated = '1']] 

但它會返回元素

<item Text="Menu2" Authenticated="0" /> 

,我不想在結果中。

+1

你有什麼試過?從標題看,我想與'SimpleXMLElement :: xpath'相關的東西。你能把它添加到你的問題嗎? – 2013-02-23 22:14:57

+0

我已經添加了我嘗試的xpath和結果中不需要的項目。 – 2013-02-23 22:55:01

回答

0

我不認爲有使用XPath一種方式來獲得正是你要找的,但如果你剛剛那名認證的,像這樣的項目組:

/menu/group/item[@Authenticated!='0' or not(@Authenticated)] 

,並取回像這樣?

<menu> 
    <item Text="Menu1"/> 
    <item Text="Menu3"/> 
    <item Text="Menu4"/> 
    <item Text="Menu5"/> 
    <item Text="Menu6"/> 
    <item Text="Menu7"/> 
    <item Text="Menu8"/> 
    <item Text="Menu9"/> 
</menu> 

UPDATE:

嗯,我想我明白你的目標在什麼現在。試試這個:

/menu/group/item[(@Authenticated!='0' or not(@Authenticated)) and (../@Authenticated!='0' or not(../@Authenticated))] 

,你應該得到:

<menu> 
    <item Text="Menu1"/> 
    <item Text="Menu3"/> 
    <item Text="Menu4"/> 
    <item Text="Menu5"/> 
    <item Text="Menu6"/> 
</menu> 
+0

這將返回具有屬性「Authenticated」且不等於'0'的元素,但是我想要返回所有元素,即使它們不包含該屬性。 – 2013-02-23 23:01:03

+0

Gotcha,我更新了我的答案 – JWiley 2013-02-23 23:06:36

+0

我需要包含項目節點的結果中的組元素,如果這是不可能的,我可能會採用與xpath不同的方法,但我認爲我可以使用xpath完成此操作。 – 2013-02-23 23:07:35

0

我不認爲這是可能的純XPath的,至少不是的XPath 1.我可能只是克隆XML和運行XPath刪除// * [@ Authenticated = 0],留下您想要的結果,但通過更迂迴的方法。

相關問題