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 );DOMNode::C14N
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
DOMNode::C14N
Референца за `domnode.c14n.php` со подобрена типографија и навигација.
DOMNode::C14N
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
DOMNode::C14N — Канонизирај јазли во стринг
= NULL
bool
$exclusive = false,bool
$withComments = false,?array
$xpath = null,?array
$nsPrefixes = null): string|false
Канонизирај јазли во стринг
Параметри
exclusive-
Овозможи ексклузивно парсирање само на јазлите што се совпаѓаат со дадените префикси на xpath или именски простор.
withComments-
Задржи коментари во излезот.
xpath-
Низа од XPaths за филтрирање на јазлите. Секој запис во оваа низа е асоцијативна низа со:
-
Задолжително
queryклуч што содржи XPath израз како стринг. -
Опционален
namespacesклуч што содржи низа што ги мапира префиксите на именскиот простор (клучови) на URI-њата на именскиот простор (вредности).
-
Задолжително
nsPrefixes-
Низа од префикси на именски простор за филтрирање на јазлите.
Вратени вредности
Враќа канонизирани јазли како стринг или false Враќа ресурс од покажувач на датотека при успех, или
Примери
Пример #1 Пример со XPath прашање
Овој пример демонстрира напредна употреба на канонизирање и филтрирање на јазлите со XPath прашање.
<?php
$dom = new DOMDocument();
$dom->loadXML(<<<XML
<root xmlns:food="urn:food">
<!-- redundant namespace declaration will be canonicalized -->
<food:fruit xmlns:food="urn:food">Apple</food:fruit>
<food:fruit>Orange</food:fruit>
<food:fruit>Pear</food:fruit>
<!-- vegetables here -->
<food:vegetable>Lettuce</food:vegetable>
</root>
XML);
echo $dom->C14N(true, false, [
"query" => ".//f:fruit|.//f:fruit/text()",
"namespaces" => ["f" => "urn:food"],
]);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
<food:fruit>Apple</food:fruit><food:fruit>Orange</food:fruit><food:fruit>Pear</food:fruit>
Белешки од корисници 3 белешки
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>"[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!