Simplexml PHP получить XML - PullRequest
       5

Simplexml PHP получить XML

0 голосов
/ 10 апреля 2011

Если у меня есть такой документ:

<!-- in doc.xml -->
<a>
  <b>
    greetings?
    <c>hello</c>
    <d>goodbye</c>
  </b>
</a>

Есть ли способ использовать simplexml (или вообще-то встроенный php), чтобы получить строку, содержащую:

greetings?
<c>hello</c>
<d>goodbye</d>

Пробелы и прочее не имеют значения.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 апреля 2011

Я должен признать, что это было не так просто, как можно было бы подумать. Вот что я придумал:

$xml = new DOMDocument;
$xml->load('doc.xml');

// find just the <b> node(s)
$xpath = new DOMXPath($xml);
$results = $xpath->query('/a/b');

// get entire <b> node as text
$node = $results->item(0);
$text = $xml->saveXML($node);

// remove encapsulating <b></b> tags
$text = preg_replace('#^<b>#', '', $text);
$text = preg_replace('#</b>$#', '', $text);

echo $text;

Относительно запроса XPath

Запрос возвращает все совпадающие узлы, поэтому, если имеется несколько совпадающих тегов <b>, вы можете просмотреть $results, чтобы получить их все.

Мой запрос для '/a/b' предполагает, что <a> является корнем, а <b> является его дочерним / непосредственным потомком. Вы можете изменить его для разных сценариев. Вот ссылка на XPath . Некоторые корректировки могут включать в себя:

  • 'a/b' –– <b> является потомком <a>, но <a> где угодно, а не только в корне
  • 'a//b' –– <b> является потомком <a> независимо от его глубины, а не просто прямым ребенком
  • '//b' –– все <b> узлов в любом месте документа

Относительно способа получения содержимого строки

Я пытался использовать $node->nodeValue или $node->textContent, но оба они удаляют теги <c> и <d>, оставляя только текстовое содержимое этих тегов. Я также пытался привести его как объект DOMText, но это не сработало напрямую и принесло больше хлопот, чем оно того стоило.

Относительно использования регулярных выражений

Это можно было бы сделать без регулярных выражений, но мне было проще всего их использовать. Я хотел убедиться, что я удалил <b> и </b> только в самом начале и конце строки, на случай, если в содержимом будут другие узлы <b>.

0 голосов
/ 10 апреля 2011

Вот альтернативный вариант использования DOM (чтобы сбалансировать ответы SimpleXML!), Который выводит содержимое всех первых <b> элементов.

$doc = new DOMDocument;
$doc->load('doc.xml');
$bee = $doc->getElementsByTagName('b')->item(0);

$innerxml = '';
foreach ($bee->childNodes as $node) {
    $innerxml .= $doc->saveXML($node);
}
echo $innerxml;
0 голосов
/ 10 апреля 2011

Как насчет этого? Поскольку вы уже знаете формат XML:

<?php
$xml = simplexml_load_file('doc.xml'); 
$str = $xml->b;
$str .= "<c>".$xml->b->c."</c>";
$str .= "<d>".$xml->b->d."</d>";

echo $str;
?>
...