Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to add Attribute with Namespace Prefix using PHP Simplexml

Trying to edit an XML document that uses Excels XML-Namespaces:

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
          xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

I need to get to this result (need the ss: prefix befire Type):

<Cell ...><Data ss:Type="String">value</Data></Cell>

I've looked over the question Unable add namespace with PHPs SimpleXML but this method is not helping here. In other words, running this as outlined there

$data = $cells[$i]->addChild('Data','value'); 
$data->addAttribute("ss:Type","String","urn:schemas-microsoft-com:office:spreadsheet");

gives me

<Cell ...><Data Type="String">value</Data></Cell>

without the ss: prefix. And if I remove the urn: prefix, then I'm getting this

<Cell ...><Data xmlns:ss="schemas-microsoft-com:office:spreadsheet" ss:Type="String">value</Data></Cell>

In either case, when I open the document with Excel, the data is invisible. With urn: the ss: is missing and without urn: the definition becomes part of the element which is not working in Excel.

like image 348
user988201 Avatar asked Dec 16 '22 08:12

user988201


1 Answers

If you want to add an attribute with a specific namespace prefix w/o adding the namespace to the document, you have to specify not only the prefix in the name parameter, but also prefix it again with xmlns, in my example: xmlns:ss:Type. The namespace URI (third parameter) then will be ignored as well, so it is not necessary either:

$data->addAttribute("xmlns:ss:Type", "String");

Note the xmlns: in front of ss:Type. The output then is as required:

<Cell><Data ss:Type="String">value</Data></Cell>
like image 75
user988201 Avatar answered Jan 14 '23 13:01

user988201