如何使用php DOM获取特定的节点文本

时间:2011-09-13 16:06:57

标签: php xml dom text

我试图使用php DOM类从xml文档中获取特定节点的值(文本),但我无法正确执行,因为我得到该节点的文本内容与其后代合并。

我们假设我需要从此文档中获取

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

我得到了:

LarchRedwoodChestnutBirchLarchRedwood

你可以看到我无法从整个文本中删除 trimmed 树所做的子串 LarchRedwood ,因为我只能得到 ChestnutBirch 和这不是我需要的。

有什么建议吗? (感谢名单)

4 个答案:

答案 0 :(得分: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));
}

给定节点就像一个根,如果在解析子节点时没有tagName,那么它本身就是,所以该子节点的值就是它自己的值。
在一个坏的形成的xml文档中,一个节点可以有许多值,将它们全部放入一个数组中以获得节点的整个值。
使用上面的函数获取所需的节点值,而不在其中合并子节点值。

参数是:
$ node(必需)必须是DOMElement对象
$ implode(可选)如果你想获得一个字符串(默认为true)或由多个值组成的数组(false)。 (如果您希望使用“胶水”字符串内爆数组,请设置字符串而不是布尔值。)

答案 1 :(得分: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;

答案 2 :(得分:0)

使用$node->nodeValue获取节点的文本内容。如果使用$node->textContent,则会从当前节点和所有子节点获取所有文本。

答案 3 :(得分: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

'希望有所帮助!