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

An array of XPaths to filter the nodes by. Each entry in this array is an associative array with:

  • A required query key containing the XPath expression as a string.
  • An optional namespaces key containing an array that maps namespace prefixes (keys) to namespace URIs (values).

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 en caso de 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 resultado del ejemplo sería:

<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