我很难将xml文档加载到dom中,保留空标记和空大小的字符串。下面是一个例子:
$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>
IE空大小字符串被删除,只加载空元素。我相信它发生在loadxml()上。有没有办法说服domdocument loadxml()不要将空大小的字符串转换为空元素?如果dom将具有空大小字符串的textnode作为元素的子元素,则更可取。
由于加载的数据会进一步发生什么情况,因此需要在php dom中找到解决方案。
最佳答案
区别这两者的问题在于,当domdocument加载xml序列化文档时,它只遵循规范。
根据这本书,在<element></element>
元素中没有空的文本节点-这也是其他人已经评论过的。
但是,如果在其中插入一个空的文本节点,domdocument就可以了。然后,您可以很容易地区分自结束标记(没有子元素)和空元素(有一个子元素,一个空文本节点)。
那么如何输入那些空的文本节点呢?例如,通过使用fromthe XMLReader based XMLReaderIterator library,特别是domareadingiteration,它能够构建文档,同时为每个当前的xmlreader节点提供交互:
$doc = new DOMDocument();
$iterator = new DOMReadingIteration($doc, $reader);
foreach ($iterator as $index => $value) {
// Preserve empty elements as non-self-closing by making them non-empty with a single text-node
// children that has zero-length text
if ($iterator->isEndElementOfEmptyElement()) {
$iterator->getLastNode()->appendChild(new DOMText(''));
}
}
echo $doc->saveXML();
为您提供以下信息:
<?xml version="1.0" encoding="utf-8"?>
<root><element></element></root>
此输出:
<?xml version="1.0"?>
<root><element></element></root>
没有附加任何字符串。构建良好的domdocument。这个例子来自
examples/read-into-dom.php
并且很好地证明了当您通过xmlreader加载文档并处理您拥有的单个特殊情况时,这是没有问题的。关于php - 如何区分DOMDocument中的空元素和null大小的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24098067/