DOMNode::C14N

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMNode::C14NCanonicaliza nós para uma string

Descrição

public DOMNode::C14N(
    bool $exclusive = false,
    bool $withComments = false,
    ?array $xpath = null,
    ?array $nsPrefixes = null
): string|false

Canonicaliza nós para uma string

Parâmetros

exclusive

Habilita a análise exclusiva apenas dos nós correspondentes à expressão xpath fornecida ou aos prefixos de namespace.

withComments

Mantém comentários na saída.

xpath

Um array de XPaths pelos quais os nós serão filtrados. Cada entrada neste array é um array associativo com:

  • Uma chave query requerida, contendo a expressão XPath como uma string.
  • Uma chave namespaces opcional, contendo um array que mapeia prefixos de namespaces (chaves) para URIs de namespaces (valores).

nsPrefixes

Um array de prefixos de namespace para filtrar os nós.

Valor Retornado

Retorna nós canonizados como uma string ou false em caso de falha

Exemplos

Exemplo #1 Exemplo com consulta XPath

Este exemplo demonstra um uso avançado canonizando e filtrando os nós por um consulta XPath.

<?php

$dom
= new DOMDocument();
$dom->loadXML(<<<XML
<root xmlns:comida="urn:comida">
<!-- declaração de namespace redundante será canonizada -->
<comida:fruta xmlns:comida="urn:comida">Maçã</comida:fruta>
<comida:fruta>Laranja</comida:fruta>
<comida:fruta>Pera</comida:fruta>
<!-- folhas aqui -->
<comida:folha>Alface</comida:folha>
</root>
XML);

echo
$dom->C14N(true, false, [
"query" => ".//f:fruta|.//f:fruta/text()",
"namespaces" => ["f" => "urn:comida"],
]);
?>

O exemplo acima produzirá:

<comida:fruta>Maçã</comida:fruta><comida:fruta>Laranja</comida:fruta><comida:fruta>Pera</comida:fruta>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 3 notes

up
21
Rijk
11 years ago
When working with (malformed) HTML, you're probably better off using DOMDocument's saveHTML() method instead. C14N() will attempt to make your HTML valid XML, for example by converting <br> to <br></br>.

So instead of:
$html = $Node->C14N();

Use:
$html = $Node->ownerDocument->saveHTML( $Node );
up
16
jorda at edpsciences dot org
9 years ago
C14N() returns an empty string if the node is not included in the document tree:
<?php
$d
= new DOMDocument('1.0');
$d->loadXML('<foo></foo>');
$n = $d->createElement('bar');
var_dump($n->C14N());
$d->documentElement->appendChild($n);
var_dump($n->C14N());
?>
output:
string(0) ""
string(11) "<bar></bar>"
up
3
lordbaco
8 years ago
[edit by nielsdos: This has been fixed starting in PHP 8.4]

Good to know:

<< Due to a known issue in XML canonicalization in PHP, processing large metadata files in SimpleSAMLphp takes a big amount of resources, with that amount growing approximately by the square of the number of entities in the metadata set >>
https://simplesamlphp.org/metaprocessing

<< The C14N() function appears to have a runtime that is O(N^2) (or possibly worse?) depending on input size, which means that it becomes very slow as the input grows. For example, an input with around 196000 nodes takes about 290 seconds, while an input with 486000 nodes takes 2200 seconds. >>
https://bugs.php.net/bug.php?id=53655

We had the same issue with a 4.1 MB XML (105k lines). The sample code of ticket #53655 takes 1h36 minute to canonicalize it!
To Top