PHP SimpleXMLElement - 初始声明和命名空间

PHP SimpleXMLElement - Initial declaration & namespaces

我正在尝试 replicate this XML structure。我唯一无法处理的是初始声明。让我引用最相关的部分。

<p:FatturaElettronica versione="FPA12" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">

如果我查看源代码,我会发现实际上这条语句如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">

p: 命名空间和相关的 xmlns:p 属性,我不知道我应该如何实现它我的 PHP SimpleXMLElement 脚本。

我在 addChild 和 addAttribute 中使用名称空间玩了 2 天,阅读教程也没有成功。我放弃。我将所有更改还原为以下明显错误的语句。

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><FatturaElettronica versione="FPA12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd"></FatturaElettronica>');

它到底是怎么工作的?我从来没有这么卡过。 谢谢你的时间。

SimpleXML 有一个不寻常的怪癖,其中命名空间前缀是从根元素中过滤的。我不确定为什么会这样。

但是,我使用的解决方法基本上是在前缀上加上前缀,这样解析器只会删除第一个,而留下第二个

$xmlTest = new SimpleXMLElement('<xmlns:ws:Test></xmlns:ws:Test>', LIBXML_NOERROR, false, 'ws', true);
$xmlTest->addAttribute('xmlns:xmlns:ws', 'http://url.to.namespace');
$xmlTest->addAttribute('xmlns:xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');

这似乎对我有用,但我很想知道为什么 SimpleXML 会这样做。

Source