W3docs

asXML()

Aprenda como o SimpleXMLElement::asXML() do PHP retorna XML como string ou grava em arquivo, com exemplos e armadilhas comuns.

Introdução

SimpleXMLElement::asXML() é o método que você chama quando termina de construir ou modificar XML com SimpleXML e quer o resultado de volta - seja como uma string que pode ser exibida, retornada ou armazenada, ou gravada diretamente em um arquivo. É essencialmente o inverso de simplexml_load_string(): enquanto o carregamento converte texto XML em um objeto navegável, asXML() converte esse objeto de volta em texto XML.

Esta página aborda os dois modos de funcionamento, o que ele retorna, como se comporta em um único nó versus o documento inteiro, e as armadilhas que pegam as pessoas de surpresa (sem formatação automática, sem declaração XML em sub-nós).

Sintaxe

// Mode 1: return the XML as a string
public SimpleXMLElement::asXML(): string|false

// Mode 2: write the XML to a file, return true/false
public SimpleXMLElement::asXML(string $filename): bool
  • $filename (opcional) - se fornecido, o XML é gravado nesse caminho e o método retorna true em caso de sucesso ou false em caso de falha. Se omitido, o XML é retornado como uma string.

asXML() e saveXML() são aliases - fazem exatamente a mesma coisa.

Retornando XML como string

Chame asXML() sem argumento para obter o documento como uma string. Este é o uso mais comum - serialize e então exiba, registre ou envie como corpo de uma resposta HTTP.

php— editable, runs on the server

Saída:

<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>

Construímos a árvore com addChild(), e então asXML() serializa tudo. Observe que a saída fica em uma única linha - o SimpleXML não indenta nem formata automaticamente. Veja Armadilhas abaixo para saber como formatar.

Chamando asXML() em um único nó

asXML() funciona em qualquer elemento, não apenas na raiz do documento. Chamado em um nó filho, serializa apenas aquele nó e seus descendentes - e, importante, omite a declaração <?xml ... ?>, pois um fragmento não é um documento independente.

<?php

$xml = new SimpleXMLElement(
    '<books><book><title>PHP Basics</title></book></books>'
);

// Whole document - includes the XML declaration
echo $xml->asXML(), "\n";

// A single node - no declaration, just the fragment
echo $xml->book->title->asXML(), "\n";

Saída:

<?xml version="1.0"?>
<books><book><title>PHP Basics</title></book></books>
<title>PHP Basics</title>

Isso torna asXML() útil para extrair um ramo de um documento maior como seu próprio fragmento.

Gravando XML em um arquivo

Passe um nome de arquivo e asXML() grava o documento lá em vez de retornar uma string. O valor de retorno é um boolean que você deve verificar, pois a gravação pode falhar (caminho inválido, sem permissão, disco cheio).

<?php

$xml = new SimpleXMLElement('<config><host>localhost</host></config>');

if ($xml->asXML('config.xml')) {
    echo "Saved successfully\n";
} else {
    echo "Failed to write file\n";
}

Quando um nome de arquivo é fornecido, asXML() retorna true (não a string XML), portanto não tente exibir o resultado esperando a marcação.

Armadilhas

  • Sem formatação automática. asXML() emite XML compacto em uma única linha. Para indentá-lo, passe a string para o DOM:

    <?php
    
    $xml = new SimpleXMLElement('<a><b>hi</b></a>');
    
    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());
    
    echo $dom->saveXML();

    Saída:

    <?xml version="1.0"?>
    <a>
      <b>hi</b>
    </a>
  • A saída de sub-nós não tem declaração XML - somente a raiz do documento produz a linha <?xml ... ?>.

  • false significa falha. Ao gravar em arquivo, sempre verifique o retorno boolean em vez de assumir sucesso.

Relacionados

Conclusão

SimpleXMLElement::asXML() serializa um objeto SimpleXML de volta em texto XML. Sem argumento, retorna a marcação como uma string; com um nome de arquivo, grava o documento em disco e retorna um boolean. Lembre-se de que produz saída compacta (use DOM se precisar de indentação) e que chamá-lo em um nó filho gera um fragmento sem declaração.

Prática

Prática
Qual é o propósito da função asXML() no PHP?
Qual é o propósito da função asXML() no PHP?
Was this page helpful?