【发布时间】:2014-06-07 14:06:52
【问题描述】:
我无法将 XML 文档加载到 DOM 中,保留空标签和 null 大小的字符串。这里是例子:
$doc = new DOMDocument("1.0", "utf-8");
$root = $doc->createElement("root");
$doc->appendChild($root);
$element = $doc->createElement("element");
$root->appendChild($element);
echo $doc->saveXML();
生成以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<root><element/></root>
空元素,完全符合预期。现在让我们将空文本节点添加到元素中。
$doc = new DOMDocument("1.0", "utf-8");
$root = $doc->createElement("root");
$doc->appendChild($root);
$element = $doc->createElement("element");
$element->appendChild($doc->createTextNode(""));
$root->appendChild($element);
echo $doc->saveXML();
生成以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<root><element></element></root>
具有空大小字符串的非空元素。好的!但是当我想做的时候:
$doc = new DOMDocument();
$doc->loadXML($xml);
echo $doc->saveXML($doc);
在这些 XML 文档上我总是得到
<?xml version="1.0" encoding="utf-8"?>
<root><element/></root>
即删除了空大小的字符串,只加载了空元素。我相信它发生在 loadXML() 上。 有什么方法可以说服 DOMDocument loadXML() 不要将 null 大小的字符串转换为空元素? 如果 DOM 将带有 null 大小字符串的 TextNode 作为元素的子元素,那就更好了。
解决方案需要在 PHP DOM 中,因为加载的数据会进一步发生变化。
【问题讨论】:
-
顺便问一下你的 $xml 是什么?
-
How to create an XML text node with an empty string value (in Java) 的可能副本。空文本节点(零长度字符串)不是文本节点,见stackoverflow.com/a/3885737/2044940
-
任意 xhtml 内容。我发现如果文档用作 Content-Type: text/html ,则 xhtml 的完全有效的 元素无法正确呈现。它必须表示为 以便浏览器正确理解。所以我的想法是在交付之前加载 xhtml 以查找标记是否有空的 元素并相应地修复它。更改服务器上的 Content-Type 是没有问题的,因为如果文件保存在本地,浏览器会使用 text/html。
-
@CoDEmanX 不是骗子:我很清楚 XML 解析器认为无字符串和空字符串之间没有区别。我的问题是关于如何通过使用空的 TextNode 来注意加载 DOM 树中的这种差异 - 如我上面的示例所示。我可以创建空子 TextNode。我可以在加载时做同样的事情吗?
-
XML 和 XHTML 与 HTML 不兼容,XSLT 处理器确实不能用于 HTML。我怀疑 PHP 有一个隐藏选项来禁用要使用的自关闭元素,因此您必须遍历整个 DOM 树并添加空文本节点(不确定如何),或者使用 XSLT 处理器来扩展自关闭元素(示例发布在自己的答案中)。