PHP - Извлечь кусок XML из большого документа XML - PullRequest
1 голос
/ 15 декабря 2009

Я задавал похожий вопрос на прошлой неделе, но не получил ответа, который действительно прибил его. Я подозреваю, что вопрос должен быть сформулирован более четко, поэтому здесь идет речь:

Учитывая этот XML:

<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

Как мне вернуть именно это:

  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>

Мне не нужен объект simplexml, я не хочу ничего преобразовывать, я не хочу только значения узлов, я не хочу новый XML-документ с соответствующим заголовком ... только это кусок XML. Не могу использовать внешние библиотеки ... ничего, что не идет со стандартной, обычной установкой PHP. Как мне извлечь одно из другого?

Моя лучшая догадка? Используйте DomDocument, чтобы как-то получить имена и содержимое узлов, а затем перестроить то, что я хочу, используя цикл foreach и выводя на экран различные имена и значения узлов, включая окончания строк, чтобы правильно отформатировать все. Тем не менее, кажется, что это может быть удивительно неуклюжим. Я подозреваю, что есть более простой способ сделать это, поэтому я хочу посмотреть, знает ли кто-нибудь здесь на stackoverflow, что это за способ (или может сказать мне, что на самом деле это НЕ более простой способ). Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 15 декабря 2009

Примерно так (с использованием XPath - если у вас есть другой способ получить список гостевых элементов, вы можете использовать это), следует выполнить свою задачу.

$xml = '';
$xpath = new DOMXPath($document);
foreach($xpath->query('//everyone/guest') as $guestNode) {
    $xml .= $document->saveXML($guestNode);
}
2 голосов
/ 15 декабря 2009
$reader = new XMLReader();
$reader->xml($xml_str);
$reader->read();
$inner = $reader->readInnerXML();

// $inner is your desired xml string.

Одним из преимуществ использования XMLReader является то, что он использует меньше памяти, чем SimpleXML или классы DOM. Другое дело, что это очень быстро.

2 голосов
/ 15 декабря 2009
$string = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

XML;

$xml = new SimpleXMLElement($string);
$nodes = $xml->xpath('/everyone/guest');

$result = '';
foreach ( $nodes as $node ) {
  $result .= $node->asXML()."\n";
}
echo $result;
die;
1 голос
/ 15 декабря 2009
preg_match('`<guest>.*</guest>`is', $xml, $matches);
print_r($matches);
0 голосов
/ 21 сентября 2013

См. Листинг 5 здесь:

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