PHP 8.5.0 Alpha 2 available for testing

DOMNode::C14N

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

DOMNode::C14NCanoniza nodos en una cadena

Descripción

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

Canoniza nodos en una cadena de caracteres.

Parámetros

exclusive

Activa el análisis de los únicos nodos correspondientes al XPath o a los prefijos de espacio de nombres proporcionados.

withComments

Conserva los comentarios en la salida.

xpath

Un array de XPaths para filtrar los nodos. Cada entrada en este array es un array asociativo con :

  • Una clave query requerida que contiene la expresión XPath como cadena de caracteres.
  • Una clave namespaces opcional que contiene un array que mapea los prefijos del espacio de nombres (claves) a los URI del espacio de nombres (valores).

nsPrefixes

Un array de prefijos de espacios de nombres utilizados para filtrar los nodos.

Valores devueltos

Devuelve los nodos canonizados, en forma de una string o false si ocurre un error

Ejemplos

Ejemplo #1 Ejemplo con una consulta XPath

Este ejemplo demuestra un uso avanzado mediante la canonicalización y el filtrado de nodos a través de una consulta XPath.

<?php

$dom
= new DOMDocument();
$dom->loadXML(<<<XML
<root xmlns:food="urn:food">
<!-- declaración de espacio de nombres redundante que será canonizada -->
<food:fruit xmlns:food="urn:food">Pomme</food:fruit>
<food:fruit>Orange</food:fruit>
<food:fruit>Poire</food:fruit>
<!-- vegetales aquí -->
<food:vegetable>Laitue</food:vegetable>
</root>
XML);

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

El ejemplo anterior mostrará :

<food:fruit>Pomme</food:fruit><food:fruit>Orange</food:fruit><food:fruit>Poire</food:fruit>

Ver también

add a note

User Contributed Notes 3 notes

up
21
Rijk
12 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
10 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
9 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