DOMNode::C14N
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
DOMNode::C14N — Canonicalize nodes to a string
说明
public DOMNode::C14N(
bool
bool
?array
?array
): string|false
bool
$exclusive
= false
,bool
$withComments
= false
,?array
$xpath
= null
,?array
$nsPrefixes
= null
): string|false
Canonicalize nodes to a string
参数
exclusive
-
Enable exclusive parsing of only the nodes matched by the provided xpath or namespace prefixes.
withComments
-
Retain comments in output.
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).
-
A required
nsPrefixes
-
An array of namespace prefixes to filter the nodes by.
返回值
Returns canonicalized nodes as a string 或者在失败时返回 false
示例
示例 #1 Example with XPath query
This example demonstrates advanced usage canonicalizing and filtering the nodes by an XPath query.
<?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"],
]);
?>
以上示例会输出:
<food:fruit>Apple</food:fruit><food:fruit>Orange</food:fruit><food:fruit>Pear</food:fruit>
+添加备注
用户贡献的备注 3 notes
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 );
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>"
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!