忽略php/simplexml-LIBXML选项?
我试图将LIBXML*常量用于忽略php/simplexml-LIBXML选项?,php,simplexml,libxml2,Php,Simplexml,Libxml2,我试图将LIBXML*常量用于simplexmlement构造函数的第二个参数,但它们根本不会改变任何东西 $xml = '<root><empty_tag/><foo></foo></root>'; $simpleXml = new SimpleXMLElement($xml, LIBXML_NOENT|LIBXML_NOXMLDECL|LIBXML_NOEMPTYTAG); $simpleXml->foo = 'Ņ'; e
simplexmlement
构造函数的第二个参数,但它们根本不会改变任何东西
$xml = '<root><empty_tag/><foo></foo></root>';
$simpleXml = new SimpleXMLElement($xml, LIBXML_NOENT|LIBXML_NOXMLDECL|LIBXML_NOEMPTYTAG);
$simpleXml->foo = 'Ņ';
echo $simpleXml->asXML();
$xml='';
$simpleXml=newsimplexmlement($xml,LIBXML_NOENT | LIBXML_NOXMLDECL | LIBXML_NOEMPTYTAG);
$simpleXml->foo='Ņ';
echo$simpleXml->asXML();
预期:
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
Ņ
实际:
<?xml version="1.0"?>
<root><empty_tag/><foo>Ņ</foo></root>
Ņ;
如您所见,这些标志中没有任何一个起作用-实体仍然被转义(即使XML应该只转义
“&>),您需要添加这样一个事实,即XML文档是使用UTF-8编码的,因此类似于
$xml = '<?xml version="1.0" encoding="utf-8" ?><root><empty_tag/><foo></foo></root>';
$xml='';
给你
<?xml version="1.0" encoding="utf-8"?>
<root><empty_tag/><foo>Ņ</foo></root>
Ņ
这些常量的命名可能有点含糊不清。那么实际支持什么呢
LIBXML\u 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是从相关问答中借用的:
顺便说一下,这与您的文档中的非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();
您无法看到更多的Ņ;
实体,而只能看到Unicode(UTF-8编码)中的实体。现在还显示了编码
从您的问题中,我假设这就是您“寻找”的内容
LIBXML_NOXMLDECL
列表中的第二个。我从来没有让它工作过,它有缺陷和/或有一些特定的版本要求,但老实说,我甚至不知道是否/在哪里有意地应用它
您可以从输出中删除包含XML声明的第一行(始终以“\n
”结尾)
或者,您可以再次与基础DOMDocument
相关,以输出文档元素,使其不是完整的文档,因此没有XML声明:
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement);
输出:
<root><empty_tag/><foo>Ņ</foo></root>
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
输出:
<root><empty_tag/><foo>Ņ</foo></root>
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
我希望这能为您提供所需的选项。这根本不是一个改进。当您说它忽略了LIBXML\u NOENT
-这是完全错误的,事实上您的文档没有设置为允许utf-8字符是问题所在,与此标志无关!它仍然不应该对实体进行编码当然,用户可以通过合理的默认设置来决定是否执行这些操作。但无论如何,显然LIBXML\u NOENT
和LIBXML\u NOXMLDECL
具有相同的值2,因此它们显然要在不同的上下文中使用,这是非常不幸的。尽管如此,即使我们跳过NOENT标志其他两个什么都不做。请参阅我对您的问题的评论,关于其他两个选项。为了完整起见,最好将所有这些都放在一个答案中。如果您阅读了SimpleXML中没有LIBXML_NOEMPTYTAG。至于非常好,我相信其他许多人都会很感激,谢谢!
$dom = dom_import_simplexml($simpleXml)->ownerDocument;
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
<root><empty_tag></empty_tag><foo>Ņ</foo></root>
$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();
<?xml version="1.0" encoding="UTF-8"?>
<root><empty_tag></empty_tag><foo>Ņ</foo></root>