DOMDocument::load

(PHP 5, PHP 7, PHP 8)

DOMDocument::load 从文件加载 XML

说明

public DOMDocument::load(string $filename, int $options = 0): bool

从文件加载 XML 文档。

警告

在 Windows 系统上,使用正斜杠的 Unix 风格路径会导致性能显著下降;在这种情况下,请确保调用 realpath()

参数

filename

XML 文档的路径。

options

按位 OR libxml 选项常量

返回值

成功时返回 true,失败时返回 false

错误/异常

如果传递空字符串作为 filename 或命名一个空文件,将生成警告。此警告不是由 libxml 生成的,也不能使用 libxml 的错误处理函数处理。

变更日志

版本 说明
8.3.0 此函数现在有一个暂定的 bool 返回类型。
8.0.0 静态调用此函数现在将抛出 Error。以前会引发 E_DEPRECATED

示例

示例 #1 创建文档

<?php
$doc
= new DOMDocument();
$doc->load('book.xml');
echo
$doc->saveXML();
?>

参见

添加注释

用户贡献的注释 15 个注释

15
Jonas Due Vesterheden
15 年前
我在通过 HTTP 加载文档时遇到了问题。我会收到类似这样的错误

警告:DOMDocument::load(http://external/document.xml): 无法打开流:HTTP 请求失败!HTTP/1.1 500 内部服务器错误

文档可以在浏览器中正常加载,也可以使用 wget 正常加载。问题在于,在我系统(OS X 和 Linux)上的 DOMDocument::load() 不会发送任何 User-Agent 标头,出于某种奇怪的原因,这会导致 Microsoft-IIS/6.0 返回 500 错误。

解决方案可以在 https://php.net/manual/en/function.libxml-set-streams-context.php 上找到

<?php
$opts
= array(
'http' => array(
'user_agent' => 'PHP libxml agent',
)
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

// 通过 HTTP 请求文件
$doc = DOMDocument::load('http://www.example.com/file.xml');
?>
2
hh dot lohmann at yahoo dot de
16 年前
BadGuy 的注释可能令人困惑,因为他描述的不是相关方法的特殊属性。PHP 始终在本地文件系统中工作,这意味着如果您要使用来自其他系统的资源,或者 - 实际上,BadGuy 的问题 - 需要由其他程序或进程处理的资源,您必须在代码中明确声明和管理。PHP 在这方面只是一个相当普通的程序。

BadGuy 的解决方案是使用“http 包装器”来获取来自另一个进程的输出(请参阅 PHP 手册中的“包装器”)。这样做时,必须遵守 http 调用的适当语法。
2
admin at tijnema dot tijnema dot info
17 年前
回复 BadGuy [at] BadGuy [dot] nl

当 news.php 文件位于同一服务器上时,就像您在第一个示例中所说的那样,http://my.beautiful-website.com/xmlsource/news.php 将不起作用,但您应该使用 http://localhost/xmlsource/news.phphttp://127.0.0.1/xmlsource/news.php
3
the_N_Channel
16 年前
注意,如果在 <?xml version="1.0" ?> 声明之前,文件开头有注释,则无法成功加载!
3
BadGuy [at] BadGuy [dot] nl
17 年前
请注意,此方法在执行任何远程操作之前会使用本地文件系统。'缺点' 是,如果您执行以下操作
<?php
$xml
= new DOMDocument;
$xml->load("xmlsource/news.php");
?>

此方法不会读取 news.php 文件的实际输出 - 可能是有效的 xml 数据 -,而是读取文件内容 - 显然,这将是 php 代码。因此,这将返回一个错误,指出 news.php 缺少 xml 声明,可能还缺少 xml 开始标签

以下方法将起作用

<?php
$xml
= new DOMDocument;
$xml->load("http://my.beautiful-website.com/xmlsource/news.php");
?>

这将强制使用 http 请求来获取此文件,而不是仅仅本地读取它,并且文件只返回代码
1
sainthyoga2003 at gmail dot com
12 年前
在默认示例中

<?php
$doc
= new DOMDocument();
$doc->load('book.xml');
echo
$doc->saveXML();
?>

您必须为 book.xml 输入绝对路径,因为在 load 函数中才能获得 false 结果。
1
Raf-sns
9 个月前
注意选项“preserveWhiteSpace”

$dom = new DOMDocument;
// false -> 这保留空白
// true -> 这将使所有条目内联
$dom->preserveWhiteSpace = false; // 保留空白!
0
sainthyoga2003 at gmail dot com
13 年前
我找到了 xml:id 警告的解决方案,在以下地址有说明:https://fosswiki.liip.ch/display/BLOG/GetElementById+Pitfalls

它解释了
ID 必须是有效的 NCName,例如,这意味着第一个字母不能是数字。

在我的 xml:id 中,有一个数字。:D
0
_ michael
14 年前
XHTML 和实体:zachatwork 在 gmail 点 com 提供的解决方案对我来说不起作用。我在多个服务器(包括 LAMPP 和 WAMPP)上测试了它——在每个服务器上,使用 LIBXML_DTDLOAD 选项调用 loadXML() 都会触发对 DTD 的外部请求。这是一个坏消息。

如果 allow_url_fopen 被关闭,对 DTD 的请求会因警告而失败。如果它被打开,请求会因为这些 w3c URL 返回 503 服务不可用而失败。

无论哪种情况,HTML 实体都会生成警告。

就我所知,最好的解决方案是简单地忽略这些警告并使用“@”抑制它们。我不建议使用 loadHTML() 而不是 loadXML() 来解析 XHTML——是的,你摆脱了实体问题,但 loadHTML() 在解析时会更改源代码(尝试“修复”它,即使没有需要修复的地方)。
0
syntaxiko
15 年前
如果使用 XML DOM PECL 模块,则该函数将无法工作
-2
daevid at daevid dot com
18 年前
假设你想从一个 .XSD 文件动态加载一个数组。此方法适合你。只要记得在 xpath 等中使用实际的 xs: 部分。

所有其他“加载”方法都会出错。

<?php
$attributes
= array();
$xsdstring = "/htdocs/api/xsd/common.xsd";
$XSDDOC = new DOMDocument();
$XSDDOC->preserveWhiteSpace = false;
if (
$XSDDOC->load($xsdstring))
{
$xsdpath = new DOMXPath($XSDDOC);
$attributeNodes =
$xsdpath->
query('//xs:simpleType[@name="attributeType"]')
->
item(0);
foreach (
$attributeNodes->childNodes as $attr)
{
$attributes[ $attr->getAttribute('value') ] = $attr->getAttribute('name');
}
unset(
$xsdpath);
}
print_r($attributes);
?>
-2
_ michael
14 年前
load() 会根据 XML 声明的细节处理非 ASCII 字符,但方式有些令人惊讶。人们会认为声明 '<?xml version="1.0" encoding="UTF-8"?>' 和 '<?xml version="1.0"?>' 的处理方式相同,因为 UTF-8 毕竟是默认编码。但事实并非如此。

* 如果有明确定义编码的 XML 声明,非 ASCII 字符将保持不变。
* 如果 XML 声明没有明确定义编码,或者 XML 声明缺失,非 ASCII 字符将被转换为数字实体。

因此,文档

<?xml version="1.0"?>
<root><nonascii>ä</nonascii></root>

将被转换为

<?xml version="1.0"?>
<root><nonascii>&#xE4;</nonascii></root>

如果根本没有 XML 声明,也会发生这种情况。另一方面,文档

<?xml version="1.0" encoding="UTF-8"?>
<root><nonascii>ä</nonascii></root>

将保持原样。

此行为也适用于 loadXML()。
-2
darren at viamedia dot co dot za
16 年前
如果你要加载 xml 并打算根据内部 dtd 对其进行验证,并且你遇到了验证问题,这可能与缺少 LIBXML 常量有关。

我在 root 级别 dom 文档中找到了“aidan 在 php 点 net 上”的这篇文章,我认为它可能对这里更有用
从 PHP 5.1 开始,可以使用常量而不是专有 DomDocument 属性来设置 libxml 选项。

DomDocument->resolveExternals 等效于设置
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse 等效于设置
LIBXML_DTDLOAD
LIBXML_DTDVALID

鼓励 PHP 5.1 用户使用新的常量。

示例
<?php
$dom
= new DOMDocument;
// 解析外部文件
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// 或
// 根据 DTD 进行验证
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>
-2
zachatwork at gmail dot com
15 年前
你可以轻松地使用 LIBXML_DTDLOAD 选项避免关于 &nbsp; 引用 的警告。

<?php

$html
= <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<p>&nbsp;</p>
</body>
</html>
EOF;

// 这个可以完美运行。
$dom = new DOMDocument();
$dom->loadXML($html, LIBXML_DTDLOAD);
print
$dom->saveXML();

// 这个会产生警告。
$dom = new DOMDocument();
$dom->loadXML($html);
print
$dom->saveXML();

?>

另请参阅: https://php.net/manual/en/libxml.constants.php

请注意,libxml 会检测到你的 DTD 通过 /etc/xml/catalog 可在本地获得。因此,不必担心这会导致你的 DOM 加载执行外部网络请求。
-9
sainthyoga2003 at gmail dot com
13 年前
为子节点添加 id 时,如果我使用抽象模式,我会收到以下警告

[quote]警告:DOMDocument::load() [domdocument.load]:xml:id:属性值 xx 不是 NCName 在 /fake/path/to/xmlfile[/quote]
To Top