2015-11-03 19 views
0

我目前需要一個到元素的XPath路徑。該路徑必須包含一個屬性,該屬性唯一標識路徑中的每個元素(在本例中爲name屬性)。

$DOMDocument->getNodePath();返回路徑,但沒有屬性。這些屬性是必要的,因爲XML將會發生很大的變化。

我目前正在編寫一個方法來手動檢查名稱屬性的路徑中的每個元素,然後將其插入字符串的適當位置。有沒有更容易/更快/沒有這樣做的hackish方式?

回答

0

的XSH解決方案從@choroba可以使用轉換爲PHP源DOMXpath::evaluate()

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

foreach ($xpath->evaluate('//address') as $address) { 
    $path = ''; 
    foreach ($xpath->evaluate('ancestor-or-self::*', $address) as $ancestor) { 
    $path .= '/'.$ancestor->nodeName; 
    if ($name = $ancestor->getAttribute('name')) { 
     $path .= '[@name = "'.$name.'"]'; 
    } 
    } 
    var_dump($path); 
} 

ancestor-or-self::*是一個Xpath表達式,用於獲取從上下文節點開始直到文檔元素的所有元素節點。

1

您可能可以使用XPath獲取字符串。例如,在xsh

for //address { 
    for ancestor-or-self::* 
     echo :s :n '/' 
        name() 
        xsh:if(@name, concat('[@name="', @name, '"]'),'') ; 
    echo ; 
} 

Runnnin它下面的XML

<root> 
    <customers name="2014"> 
    <customer name="John"> 
     <address/> 
    </customer> 
    <customer name="Jane"> 
     <address/> 
    </customer> 
    </customers> 
    <customers name="2015"> 
     <customer name="Daniel"> 
     <address/> 
     </customer> 
     <customer name="Dave"> 
     <address/> 
     </customer> 
    </customers> 
</root> 

我越來越

/root/customers[@name="2014"]/customer[@name="John"]/address 
/root/customers[@name="2014"]/customer[@name="Jane"]/address 
/root/customers[@name="2015"]/customer[@name="Daniel"]/address 
/root/customers[@name="2015"]/customer[@name="Dave"]/address 
+0

對不起,忘了把php放在標籤中。我現在正在查找xsh,看看它是否會有所幫助。謝謝。 – dabuda