我目前需要一個到元素的XPath路徑。該路徑必須包含一個屬性,該屬性唯一標識路徑中的每個元素(在本例中爲name屬性)。
$DOMDocument->getNodePath();
返回路徑,但沒有屬性。這些屬性是必要的,因爲XML將會發生很大的變化。
我目前正在編寫一個方法來手動檢查名稱屬性的路徑中的每個元素,然後將其插入字符串的適當位置。有沒有更容易/更快/沒有這樣做的hackish方式?
我目前需要一個到元素的XPath路徑。該路徑必須包含一個屬性,該屬性唯一標識路徑中的每個元素(在本例中爲name屬性)。
$DOMDocument->getNodePath();
返回路徑,但沒有屬性。這些屬性是必要的,因爲XML將會發生很大的變化。
我目前正在編寫一個方法來手動檢查名稱屬性的路徑中的每個元素,然後將其插入字符串的適當位置。有沒有更容易/更快/沒有這樣做的hackish方式?
的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表達式,用於獲取從上下文節點開始直到文檔元素的所有元素節點。
您可能可以使用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
對不起,忘了把php放在標籤中。我現在正在查找xsh,看看它是否會有所幫助。謝謝。 – dabuda