Как я могу импортировать список XML с тем же именем, используя php domdocument - PullRequest
0 голосов
/ 10 января 2019

используя php domdocument, для импорта XML-файла, у меня не может быть списка "тегов"

Я пробовал несколько способов, но не могу

XML-документ:

<resource>
  <title>hello world</title>
  <tags>
    <resource>great</resource>
    <resource>fun</resource>
    <resource>omg</resource>
</resource>

php:

<?php
$url='test.xml';
$doc = new DOMDocument();
$doc->load($url);
$feed = $doc->getElementsByTagName("resource");
foreach($feed as $entry) {
echo $entry->getElementsByTagName("username")->item(0)->nodeValue;
echo '<br>';
echo $entry->getElementsByTagName("tags")->item(0)->nodeValue;
echo '<br>';
}

Я ожидаю, что выходной список будет таким:
Привет, мир
большой
весело
OMG

но фактический вывод НЕ является списком, результатом является предложение без пробела: привет мир greatfunomg

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Если вам просто нужно вывести первый фрагмент текста для каждого элемента <resource> - где бы он ни находился, тогда с помощью XPath и (убедившись, что вы игнорируете пробел при загрузке) выберите первый дочерний элемент этого и выведите значение узла .

Игнорирование пробелов при загрузке важно, так как пробелы будут создавать узлы для всех отступов вокруг каждого элемента, поэтому первый дочерний элемент каждого элемента <resource> может быть просто новой строкой или табуляцией.

$xml = '<root>
    <resource>
      <title>hello world</title>
      <tags>
        <resource>great</resource>
        <resource>fun</resource>
        <resource>omg</resource>
      </tags>
    </resource>
</root>';

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadXML($xml);
// $doc->load($filename);   // If loading from a file
$xpath = new DOMXpath($doc);

$resources = $xpath->query("//resource");
foreach ( $resources as $resource ){
    echo $resource->firstChild->nodeValue.PHP_EOL;
}

Выход которого

hello world
great
fun
omg

Или без использования XPath ...

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadXML($xml);
//$doc->load($filename);

$resources = $doc->getElementsByTagName("resource");
foreach ( $resources as $resource ){
    echo $resource->firstChild->nodeValue.PHP_EOL;
}
0 голосов
/ 10 января 2019

DOMDocument::getElementsByTagName() возвращает все узлы дочерних элементов с указанным именем. DOMElement::$nodeValue вернет текстовое содержимое узла элемента, включая всех его потомков.

В вашем случае echo $entry->getElementsByTagName("tags")->item(0)->nodeValue выбирает все tags, получает доступ к первому узлу этого списка и выводит его текстовое содержимое. Это greatfunomg.

Использование методов DOM для доступа к узлам является многословным и требует много кода и, если вы хотите сделать это правильно, много условий. Это намного проще, если вы используете выражения Xpath. Позволяет скалярные значения и списки узлов из DOM.

$xml = <<<'XML'
<_>
    <resource>
      <title>hello world</title>
      <tags>
        <resource>great</resource>
        <resource>fun</resource>
        <resource>omg</resource>
      </tags>
    </resource>
</_>
XML;

$document = new DOMDocument();
$document->loadXML($xml);
// create an Xpath instance for the document
$xpath = new DOMXpath($document);

// fetch resource nodes that are a direct children of the document element
$entries = $xpath->evaluate('/*/resource');
foreach($entries as $entry) {
    // fetch the title node of the current entry as a string
    echo $xpath->evaluate('string(title)', $entry), "\n";

    // fetch resource nodes that are children of the tags node
    // and map them into an array of strings
    $tags = array_map(
      function(\DOMElement $node) {
          return $node->textContent;
      },
      iterator_to_array($xpath->evaluate('tags/resource', $entry))
    );

    echo implode(', ', $tags), "\n";
}

Выход:

hello world 
great, fun, omg
...