Я пытаюсь воспроизвести эту XML-структуру. Единственное, с чем я не могу справиться, - это первоначальное объявление. Процитирую самую важную часть.
<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">
Есть пространство имен п: и связанный атрибут xmlns: p, и я понятия не имею, как мне реализовать его в моем сценарии PHP SimpleXMLElement.
Уже 2 дня я играю с пространствами имен в addChild и addAttribute и читаю учебники безуспешно. Я сдаюсь. Я вернул все изменения в следующее заявление, которое явно неверно.
$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 делает именно это.
Спасибо, Эшли! Теперь я вспоминаю, что несколько месяцев назад у меня была такая же проблема при работе с XML-файлами Sitemap. Честно говоря, я не понимаю, почему мне нужно ставить префикс перед префиксом: - | SimpleXML такой странный. Еще раз спасибо за ваше время!