2011-09-13 238 views
1

我想從使用php DOM類的xml文檔中獲取特定節點的值(文本),但我無法正確執行此操作,因爲我獲取了該節點的文本內容與其後代合併。如何使用php獲取特定的節點文本DOM

讓我們假設我需要從這個文件得到樹木

<?xml version="1.0"?> 
<trees> 
    LarchRedwoodChestnutBirch 
    <trimmed>Larch</trimmed> 
    <trimmed>Redwood</trimmed> 
</trees> 

我也得到:

LarchRedwoodChestnutBirchLarchRedwood 

你可以看到,我不能刪除子LarchRedwood做由削減樹從全文,因爲我會得到只有栗子樺,這不是我所需要的。

有什麼建議嗎? (Thanx)

回答

0

使用$node->nodeValue來獲取節點的文本內容。如果您使用$node->textContent,您將獲取當前節點和所有子節點的所有文本。

1

你可以試試這個刪除trimmed節點

$doc = new DOMDocument('1.0', 'utf-8'); 
$doc->loadXML($xml); 

$xpath = new DOMXpath($doc); 
$trees = $doc->getElementsByTagName('trees')->item(0); 
foreach ($xpath->query('/trees/*') as $node) 
{ 
    $trees->removeChild($node); 
} 
echo $trees->textContent; 
echo $trees->nodeValue; 
0

理想情況下,XML應該是:

<?xml version="1.0"?> 
<trees> 
    <tree>Larch</tree> 
    <tree>Redwood</tree> 
    <tree>Chestnut</tree> 
    <tree>Birch</tree> 
</trees> 

要拆分 「LarchRedwoodChestnutBirch」 成單獨的單詞(由大寫字母),你」需要使用PHP的「PCRE」功能:

http://www.php.net/manual/en/book.pcre.php

'希望有所幫助!

3

我明白了。這工作:

function specificNodeValue($node, $implode = true) { 
    $value = array(); 
    if ($node->childNodes) { 
    for ($i = 0; $i < $node->childNodes->length; $i++) { 
     if (!(@$node->childNodes->item($i)->tagName)) { 
     $value[] = $node->childNodes->item($i)->nodeValue; 
     } 
    } 
    } 
    return (is_string($implode) ? implode($implode, $value) : ($implode === true ? implode($value) : $value)); 
} 

給定的節點是像根,如果你當你分析它的子節點那麼它本身就是得不到記名,使子節點的值,這是它自己的價值。
在一個糟糕的xml文檔中,一個節點可能有許多值,把它們全部放到一個數組中以獲得節點的整個值。
使用上面的函數獲取所需的節點值,但不合並子節點值。

的參數是:
$節點(必需的)必須是一個DOMElement對象
$破滅(可選)如果你想獲得一個字符串(默認爲true)或陣列(假)由很多塊組成值。 (如果您希望使用「粘合」字符串)打亂陣列,請設置字符串而不是布爾值。