PHP 8.4.0 RC4 available for testing

DOMNode::C14N

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

DOMNode::C14NDüğümleri belgedeki yazımını bozmadan dizgeleştirir

Açıklama

public DOMNode::C14N(
    bool $özel = false,
    bool $aAçıklamalı = false,
    ?array $xpath = null,
    ?array $isim_alanları = null
): string|false

Düğümleri belgedeki yazımını bozmadan dizgeleştirir.

Bağımsız Değişkenler

özel

Sadece xpath ve/veya isim_alanları bağımsız değişkenleri ile belirtilen öneklerle eşleşen düğümlerin seçilmesi için true olmalıdır.

açıklamalı

true ise açıklamalar çıktıya dahil edilir.

xpath

Düğümleri filtrelemek için bir XPath dizisi. Bu dizideki her girdi, aşağıdakileri içeren bir ilişkisel dizidir:

  • XPath ifadesini bir dize olarak içeren gerekli bir query anahtarı.
  • Ad alanı öneklerini (anahtarlar) ad alanı URI'lerine (değerler) eşleyen bir dizi içeren isteğe bağlı bir namespaces anahtarı.

isim_alanları

Seçilecek düğümler için isim alanları dizisi.

Dönen Değerler

Düğümleri belgedeki yazımını bozmadan dizge olarak döndürür, başarısızlık durumunda false döner

Örnekler

Örnek 1 XPath sorgusu

Bu örnek, bir XPath sorgusu ile düğümlerin meşrulaştırılması ve süzülmesinin gelişmiş kullanımını göstermektedir.

<?php

$dom
= new DOMDocument();
$dom->loadXML(<<<XML
<root xmlns:food="urn:food">
<!-- gereğinden fazla isim alanı bildirimi meşrulaştırır -->
<food:fruit xmlns:food="urn:food">Elma</food:fruit>
<food:fruit>Armut</food:fruit>
<food:fruit>Portakal</food:fruit>
<!-- sebzeler burada -->
<food:vegetable>Marul</food:vegetable>
</root>
XML);

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

Yukarıdaki örneğin çıktısı:

<food:fruit>Elma</food:fruit><food:fruit>Armut</food:fruit><food:fruit>Portakal</food:fruit>

Ayrıca Bakınız

add a note

User Contributed Notes 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