这些常量的命名可能有点神秘。那么究竟支持什么?
LIBXML_NOENT
实体是作为实体引用添加到文档中还是展开。需要通过加载文档来指定:
<?php
$xml = '<!DOCTYPE test [<!ENTITY c "TEST">]>
<test>&c;</test>';
echo (new SimpleXMLElement($xml))->asXML(), "\n";
echo (new SimpleXMLElement($xml, LIBXML_NOENT))->asXML(), "\n";
这显示了第一个输出:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>&c;</test>
实体被保留。对于第二个回声,LIBXML_NOENT:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY c "TEST">
]>
<test>TEST</test>
XML 借自相关问答:What does LIBXML_NOENT do (and why isn't it called LIBXML_ENT)?
顺便说一句,这与您的文档中的非 US-ASCII 字符无关。如果您需要带有它的文档,请将编码设置为 UTF-8,例如:
$xml = '<root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml);
dom_import_simplexml($simpleXml)->ownerDocument->encoding = 'UTF-8';
$simpleXml->foo = 'Ņ';
echo $simpleXml->asXML();
这里的诀窍是set the encoding in the underlying DOMDocument,这是我知道SimpleXMLElement(和DOMDocument)的唯一方法。这里的输出:
<?xml version="1.0" encoding="UTF-8"?>
<root><empty_tag/><foo>Ņ</foo></root>
您看不到更多 &#x145; 实体,而只能看到 Unicode(UTF-8 编码)中的 Ņ。 XML declaration 现在还显示编码。
根据您的问题,我认为这就是您要“寻找”的LIBXML_NOENT。
LIBXML_NOXMLDECL
列表中的第二个。我从来没有让它工作,它有问题和/或有一些特定的版本要求,但老实说,我什至不知道是否/在哪里故意应用它。
您可以从输出中删除包含 XML 声明的第一行(总是“\n”终止)。
或者您可以再次关联底层DOMDocument 以输出文档元素,因此它不是完整的文档,因此没有 XML 声明:
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement);
输出:
<root><empty_tag/><foo>Ņ</foo></root>
这基本上是在:remove xml version tag when a xml is created in php 中建议的。
LIBXML_NOMPTYTAG
列表中的第三个也是最后一个。我现在可以引用 PHP 手册,但这已在其他地方完成 on site already 但无论如何,无论常量不可用,如何使用 SimpleXMLElement 执行此操作?
一种方法是再次通过DOMDocument 提供选项:
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
输出:
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
或者为了做这个“纯”的 SimpleXML,一个空的文本节点插入每个空元素:
$xml = '<?xml version="1.0" encoding="UTF-8"?><root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml);
$simpleXml->foo = 'Ņ';
foreach ($simpleXml->xpath('//*[not(*) and string() = ""]') as $empty) {
$empty[0] = '';
}
echo $simpleXml->asXML();
在foreach 中,获取每个 xpath 查询的所有空元素,然后将其文本内容设置为空字符串,如果没有(空),则将在其中插入一个文本节点一个。输出:
<?xml version="1.0" encoding="UTF-8"?>
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
我希望这可以为您提供您正在寻找的选项。