我正在尝试使用最小化的布尔属性解析一个简单的配置文件,并且DOMDocument没有它。我正在尝试加载以下内容:
<config>
<text id='name' required>
<label>Name:</label>
</text>
</config>
使用以下代码
$dom = new DOMDocument();
$dom->preserveWhiteSpace=FALSE;
if($dom->LoadXML($template) === FALSE){
throw new Exception("Could not parse template");
}
我收到警告
Warning: DOMDocument::loadXML(): Specification mandate value for attribute required in Entity, line: 2
我错过了一个标志或者什么来让DOMDocument解析最小的布尔属性吗?
答案 0 :(得分:1)
没有值的属性在XML 1.0或1.1中都不是有效语法,因此您所拥有的不是XML。你应该修复它。
假装不可能,可以使用:
$dom->loadHTML($template, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
相反,它使用的解析模式更宽容,但您会收到有关无效HTML标记的警告。因此,您还需要libxml_use_internal_errors(true)
和libxml_get_errors()
(您可能无论如何都要使用它来处理错误)并忽略任何错误代码为801的内容。
$notxml = <<<'XML'
<config>
<text id='name' required>
<label>Name:</label>
</text>
</config>
XML;
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($notxml, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
foreach (libxml_get_errors() as $error) {
// Ignore unknown tag errors
if ($error->code === 801) continue;
throw new Exception("Could not parse template");
}
libxml_clear_errors();
// do your stuff if everything didn't go completely awry
echo $dom->saveHTML(); // Just to prove it worked
<config>
<text id="name" required>
<label>Name:</label>
</text>
</config>