【问题标题】:How to get a specific node text using php DOM如何使用 php DOM 获取特定节点文本
【发布时间】:2025-11-28 01:30:01
【问题描述】:

我正在尝试使用 php DOM 类从 xml 文档中获取特定节点的值(文本),但由于我将该节点的文本内容与其后代合并,因此无法正确完成。

假设我需要从这个文档中获取

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

我得到:

LarchRedwoodChestnutBirchLarchRedwood

您可以看到我无法从整个文本中删除由 修剪 树生成的子字符串 LarchRedwood,因为我只会得到 ChestnutBirch 和这不是我需要的。

有什么建议吗? (感谢)

【问题讨论】:

    标签: php xml dom text


    【解决方案1】:

    我明白了。这有效:

    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(可选)如果你想得到一个字符串(默认为真)或一个由许多值组成的数组(假)。 (如果您希望使用“胶水”字符串来内爆数组,请设置字符串而不是布尔值)。

    【讨论】:

      【解决方案2】:

      你可以试试这个删除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;
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          理想情况下,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

          '希望有帮助!

          【讨论】: