DOMNode::C14N

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

DOMNode::C14N β€” ΠšΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹ Π² строку

ОписаниС

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

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ·Π»Ρ‹ Π² строку

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

exclusive

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Ρ… ΡƒΠ·Π»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с прСдоставлСнными xpath-выраТСниями ΠΈΠ»ΠΈ ns_prefixes-прСфиксами.

withComments

Π‘ΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅.

xpath

Массив XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² этом массивС β€” ассоциативный массив с:

  • ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ запроса query, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ строки.
  • ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ пространств ΠΈΠΌΡ‘Π½ namespaces, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит массив для сопоставлСния прСфиксов пространств ΠΈΠΌΡ‘Π½ (ΠΊΠ»ΡŽΡ‡Π΅ΠΉ) ΠΈ URI-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² пространств ΠΈΠΌΡ‘Π½ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ).
nsPrefixes

Массив прСфиксов пространств ΠΈΠΌΡ‘Π½ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ².

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π² Π²ΠΈΠ΄Π΅ строки ΠΈΠ»ΠΈ false, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ XPath-запроса

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΡƒΡŽ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΡƒΠ·Π»ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· XPath-запрос.

<?php

$dom
= new DOMDocument();
$dom->loadXML(<<<XML
<root xmlns:food="urn:food">
<!-- ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС пространства ΠΈΠΌΠ΅Π½ канонизируСтся -->
<food:fruit xmlns:food="urn:food">Π―Π±Π»ΠΎΠΊΠΎ</food:fruit>
<food:fruit>АпСльсин</food:fruit>
<food:fruit>Π“Ρ€ΡƒΡˆΠ°</food:fruit>
<!-- Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ΄ΡƒΡ‚ ΠΎΠ²ΠΎΡ‰ΠΈ -->
<food:vegetable>Π›Π°Ρ‚ΡƒΠΊ</food:vegetable>
</root>
XML);

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

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

<food:fruit>Π―Π±Π»ΠΎΠΊΠΎ</food:fruit><food:fruit>АпСльсин</food:fruit><food:fruit>Π“Ρ€ΡƒΡˆΠ°</food:fruit>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • DOMNode::C14NFile() - ΠšΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ·Π»Ρ‹ Π² Ρ„Π°ΠΉΠ»
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 3 notes

up
21
Rijk ΒΆ
13 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 ΒΆ
11 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 ΒΆ
10 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!