2015-01-04 66 views
-3

我測試的XML結構:如何使用XPath檢索subsubchild?

<Articles> 


... 


    <Article ID="333"> 

    <author>Paul</author> 

    <title>i hate xpath </title> 

     <child1>bla</child1> 

     <child2>blabla 
      <subchild> 
      <subsubchild DEEP = "Attribute"></subsubchild>  //this is my nightmare 
      </subchild> 
     </child2> 

     <child3>testing</child3> 

    </Article> 
... 

</Articles> 

什麼XPath表達式將獲取並更新subsubchild ATTRIB價值?如果父ID(本例中爲333)是已知的,我主要關心的是獲取和更新任何節點的子值,無論其位置有多深或多淺。

目前我使用:

$query= "//*[@ID=333]//*node()[@DEEP and @DEEP = "Attribute"]"; 
$outcome = $xml->xpath($query); 
    echo isset($outcome[0][0]) ? "found" : "unavailable"; 

和幾個相關的表述是,他們都折騰我的無效表達報告工作。

function XMLChangeAttribValue($ParentID, $attirbName, $attribValue, $NewValue){ 
 
     
 
      $xml //Never mind, i've create this sucessfully 
 

 
    
 
      $query = "//*[@ID=$ParentID]//*[@$attirbName = $attribValue]"; 
 
        
 

 
      $outcome = $xml->xpath($query); 
 
      echo isset($outcome[0][0]) ? "found" : "unavailable"; 
 
}

+2

我不知道你的問題是什麼。 「無效的表達式報告」是否意味着XPath引擎報告錯誤?然後,請顯示它。你使用PHP嗎?然後,標記問題。 XPath不是用於更新XML文檔的正確工具,請將您的預期輸出顯示爲XML。 – 2015-01-04 15:04:22

+3

避免個人言論 - 他們不完全幫助你的問題得到一個很好的答案。但是,處理我的意見將有所幫助。 – 2015-01-04 15:29:04

+0

很抱歉馬蒂亞斯如果我imodest響起,我沒有故意的,我是唯一在烏爾說的XPath supprised不能使用(或者說是不正確的工具)用於更新XML。有什麼更好的?一個foreach循環?以及通過更新我的意思是我想改變DEEP(屬性)的價值爲我選擇的東西。如果你有想法,請告訴我。再一次,接受我的同情。 – 2015-01-04 15:43:02

回答

2

的XPath來選擇subsubchild你在這種情況下,目標是:

$query = "//*[@ID=333]//*[@DEEP = 'Attribute']"; 

要選擇屬性本身,你可以使用:

$query = "//*[@ID=333]//*/@DEEP[. = 'Attribute']"; 

請注意,我在鋼琴中使用了單引號g,因爲除非您轉義它們,否則不能在雙引號字符串中使用雙引號。

還應當指出的是,在一個叢使用*node()一切都沒有在XPath表達式中有效。

+0

謝謝@Rishe。但在實際意義上,我不知道節點「subsubchild」在編譯時(或測試時間,如果你不介意)。這就是我使用xpath的node()函數的原因。我還有什麼可以在運行時獲取節點名稱?再次,我實際上想要做一個選擇所有的東西,如在「// * [@ ID = 333] // *(未知節點)...獲取任何avilable匹配。提前致謝。 – 2015-01-04 17:31:57

+0

@OsagieOdigie在這種情況下該元素的名稱是未知的,你可以使用'*'。請參閱上面的編輯。 – JLRishe 2015-01-04 17:45:03

+0

對不起,打擾你。上面的函數(我的新編輯)顯示了什麼試圖模擬。得到無效的表達式,你看到的是什麼d錯誤?thnks – 2015-01-04 18:12:17