PHP 大会日本 2024

预定义常量

以下常量由此扩展定义,并且仅在将扩展编译到 PHP 中或在运行时动态加载时可用。

LIBXML_BIGLINES (int)
允许正确报告大于 65535 的行号。

注意:

仅在 PHP 7.0.0 及更高版本(Libxml >= 2.9.0)中可用

LIBXML_COMPACT (int)
激活小型节点分配优化。这可能会加快应用程序速度,而无需更改代码。

注意:

仅在 Libxml >= 2.6.21 中可用

LIBXML_DTDATTR (int)
默认 DTD 属性
警告

启用 DTD 属性加载将启用外部实体的获取。可以使用 LIBXML_NO_XXE 常量来防止这种情况(仅在 Libxml >= 2.13.0 中可用,PHP 8.4.0 及更高版本)。

LIBXML_DTDLOAD (int)
加载外部子集
警告

启用外部子集的加载将启用外部实体的获取。可以使用 LIBXML_NO_XXE 常量来防止这种情况(仅在 Libxml >= 2.13.0 中可用,PHP 8.4.0 及更高版本)。

LIBXML_DTDVALID (int)
使用 DTD 验证
警告

启用 DTD 验证可能会导致 XML 外部实体 (XXE) 攻击。可以使用 LIBXML_NO_XXE 常量来防止这种情况(仅在 Libxml >= 2.13.0 中可用,PHP 8.4.0 及更高版本)。

LIBXML_HTML_NOIMPLIED (int)
设置 HTML_PARSE_NOIMPLIED 标志,该标志关闭自动添加隐含 html/body... 元素。

注意:

仅在 Libxml >= 2.7.7 中可用(PHP >= 5.4.0)

LIBXML_HTML_NODEFDTD (int)
设置 HTML_PARSE_NODEFDTD 标志,该标志防止在未找到文档类型定义时添加默认文档类型定义。

注意:

仅在 Libxml >= 2.7.8 中可用(PHP >= 5.4.0)

LIBXML_LOADED_VERSION (string)
libxml 的核心解析器模块的版本。
LIBXML_NOBLANKS (int)
删除空白节点
LIBXML_NOCDATA (int)
将 CDATA 合并为文本节点
LIBXML_NOEMPTYTAG (int)
展开空标签(例如 <br/><br></br>

注意:

此选项目前仅在 DOMDocument::saveDOMDocument::saveXML 函数中可用。

LIBXML_NOENT (int)
替换实体
警告

启用实体替换可能会导致 XML 外部实体 (XXE) 攻击。

LIBXML_NOERROR (int)
抑制错误报告
LIBXML_NONET (int)
加载文档时禁用网络访问
LIBXML_NOWARNING (int)
抑制警告报告
LIBXML_NOXMLDECL (int)
保存文档时删除 XML 声明

注意:

仅在 Libxml >= 2.6.21 中可用

LIBXML_NO_XXE (int)
执行实体替换时禁用 XML 外部实体 (XXE)

注意:

仅在 Libxml >= 2.13.0 中可用,PHP 8.4.0 及更高版本。

LIBXML_NSCLEAN (int)
删除冗余的命名空间声明
LIBXML_PARSEHUGE (int)
设置 XML_PARSE_HUGE 标志,该标志放宽解析器的任何硬编码限制。这会影响文档的最大深度或实体递归的限制,以及文本节点大小的限制。

注意:

仅在 Libxml >= 2.7.0 中可用(PHP >= 5.3.2 和 PHP >= 5.2.12)

LIBXML_PEDANTIC (int)
设置 XML_PARSE_PEDANTIC 标志,该标志启用严格的错误报告。

注意:

PHP >= 5.4.0 可用

LIBXML_RECOVER (int)
解析文档时启用恢复模式。

注意:

仅在 PHP 8.4.0 及更高版本中可用

LIBXML_XINCLUDE (int)
实现 XInclude 替换
LIBXML_ERR_ERROR (int)
可恢复的错误
LIBXML_ERR_FATAL (int)
致命错误
LIBXML_ERR_NONE (int)
无错误
LIBXML_ERR_WARNING (int)
简单的警告
LIBXML_VERSION (int)
libxml 版本,例如 20605 或 20617
LIBXML_DOTTED_VERSION (string)
libxml 版本,例如 2.6.5 或 2.6.17
LIBXML_SCHEMA_CREATE (int)
在 XSD 模式验证期间创建默认/固定值节点

注意:

仅在 Libxml >= 2.6.14 中可用(PHP >= 5.5.2)

添加注释

用户贡献的笔记 5 条笔记

8
@oneseventeen
13 年前
当我使用以下代码将 XML DOM 元素插入我从 XML 文件加载的现有 XML DOM 元素中时,我的新元素都没有正确格式化,它们只是显示在一行上

<?php
$dom
= DOMDocument::load('file.xml');
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks normal but the new nodes are all on one line.
?>

我发现可以将 LIBXML_NOBLANKS 传递给 load 方法,它会重新格式化整个文档,包括我添加的内容。
<?php
$dom
= DOMDocument::load('file.xml', LIBXML_NOBLANKS);
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//输出:所有内容看起来都重新格式化了,包括新节点
?>

希望这有帮助,我花了几个小时的反复试验才弄清楚这一点!
4
siraic at gmail dot com
3年前
常量 LIBXML_NOENT 的名称非常具有误导性。添加此标志实际上会导致解析器加载并插入外部实体。省略它会使标签保持不变,这可能是您想要的。
2
vetalstar at mail dot ru
7年前
LIBXML_DOTTED_VERSION 选项不起作用。
libxml 版本:2.9.4

<?php

echo LIBXML_DOTTED_VERSION;
$xml = new SimpleXMLElement('<fasa_request id="1234567"/>', LIBXML_NOXMLDECL);

?>
0
Ismael Miguel
1年前
如果要保存时不包含 XML 声明,并且 LIBXML_NOXMLDECL 对您不起作用,您可以这样做

<?php
$doc
= new \DOMDocument('1.0', 'UTF-8');
$doc->loadXML($xml, LIBXML_*);

echo
$doc->saveXML($doc->firstElementChild);
?>

这将输出不包含 XML 声明的 XML,并且无需使用标志。
您也不需要进行繁琐的替换并祈祷它能正常工作。
0
zachatwork at gmail dot com
14年前
注意:LIBXML_NOXMLDECL 常量在此库中定义,但 DOMDocument(目前)不支持。

另请参阅:http://bugs.php.net/bug.php?id=47137

<?php

print "PHP_VERSION: ".PHP_VERSION."\n";
print
"LIBXML_VERSION: ".LIBXML_VERSION."\n";
print
"LIBXML_NOXMLDECL: ".LIBXML_NOXMLDECL."\n";

$dom = new DomDocument();
$dom->loadXML("<foo />");

# 这应该可以工作,但不能。

print "DOMDocument doesn't honor LIBXML_NOXMLDECL:\n";
print
$dom->saveXML(null,LIBXML_NOXMLDECL);

# 这可以工作,并且在上述问题修复后仍然可以工作。

print "Forwards compatible workaround:\n";
$lines = explode("\n", $dom->saveXML(null, LIBXML_NOXMLDECL), 2);
if(!
preg_match('/^\<\?xml/', $lines[0]))
print
$lines[0];
print
$lines[1];

?>

PHP_VERSION: 5.3.1-0.dotdeb.1
LIBXML_VERSION: 20632
LIBXML_NOXMLDECL: 2
DOMDocument 不支持 LIBXML_NOXMLDECL
<?xml version="1.0"?>
<foo/>
向前兼容的解决方法
<foo/>
To Top