Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略php/simplexml-LIBXML选项?_Php_Simplexml_Libxml2 - Fatal编程技术网

忽略php/simplexml-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

我试图将LIBXML*常量用于
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>&#x145;</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>