Как получить конкретный текст узла с помощью php DOM - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь получить значение (текст) определенного узла из документа xml, используя классы php DOM, но я не могу сделать это правильно, потому что текстовое содержимое этого узла объединено с его потомками.

Давайте предположим, что мне нужно получить деревья из этого документа:

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

И я получу:

LarchRedwoodChestnutBirchLarchRedwood

Вы видите, что я не могу удалитьподстрока LarchRedwood сделана из обрезанных деревьев из всего текста, потому что я получу только ChestnutBirch и это не то, что мне нужно.

Anyпредложить?(Thanx)

Ответы [ 4 ]

3 голосов
/ 15 сентября 2011

Я понял.Это работает:

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 голос
/ 13 сентября 2011

Вы можете попробовать это, чтобы удалить узел 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 голосов
/ 13 сентября 2011

В идеале 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

Надеюсь, что помогает!

0 голосов
/ 13 сентября 2011

Используйте $node->nodeValue, чтобы получить текстовое содержимое узла.Если вы используете $node->textContent, вы получите весь текст из текущего узла и всех дочерних узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...