2011-10-10 7 views
4

Essayer de modifier un document XML qui utilise Excelle XML-Namespaces:Impossible d'ajouter un attribut avec espace de noms Prefix en utilisant PHP SimpleXML

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

Je dois arriver à ce résultat (besoin du ss: préfixe befire Type):

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

J'ai regardé sur la question Unable add namespace with PHPs SimpleXML mais cette méthode ne contribue pas ici. En d'autres termes, l'exécution de ce comme indiqué il

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

me donne

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

sans ss: préfixe. Et si je retire l'urne : préfixe, alors je reçois ce

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

Dans les deux cas, quand j'ouvre le document avec Excel, les données sont invisibles. Avec urn: le ss: manque et sans urn: la définition devient une partie de l'élément qui ne fonctionne pas dans Excel.

+0

J'essaye de faire la même chose en java. Peux-tu aider s'il te plait?
http://stackoverflow.com/questions/11025799/add-namespace-to-java-dom-attribute –

Répondre

11

Si vous souhaitez ajouter un attribut avec un préfixe d'espace de nom spécifique w/o ajouter l'espace de noms au document, vous devez spécifier non seulement le préfixe dans le paramètre nom , mais le préfixe aussi à nouveau avec xmlns, en mon exemple: xmlns:ss:Type. L'espace de nom URI (troisième paramètre) puis sera ignorée aussi bien, donc il ne faut pas non plus:

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

Notez les xmlns: devant ss: Type. La sortie est alors comme requis:

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

Cela m'a aidé à résoudre mon problème lors de la création de fichiers Excel en utilisant simplexml en PHP. Merci beaucoup. – Weboide

+0

Notez que cela ne définit pas réellement l'espace de noms pour l'attribut, bien que le résultat lors de la sérialisation avec ['SimpleXMLElement-> asXML()'] (http://php.net/SimpleXMLElement.asXML) soit équivalent. Au lieu de cela, "ss:" fait partie de la [partie locale] (https://www.w3.org/TR/xml-names/#NT-LocalPart) du nom de l'attribut. Comparez la sortie de $ data-> attributes ('ss', TRUE) 'et' $ data-> attributes() '. Vous pouvez également utiliser n'importe quel préfixe, pas seulement "xmlns". – outis

Questions connexes