2017-01-26 2 views
0

J'essaye d'ajouter un nouveau noeud après dans designmap.xmlErreurs SimpleXMLElement. Essayer d'ajouter XML après un point particulier

Le nouveau noeud inclut un attribut src qui est personnalisé par le tableau ci-dessous.

$newStories = Array ([0] => u102 [1] => u103 [2] => u107 [3] => u156 ); 

$designMap = simplexml_load_file('designmap.xml'); 

foreach ($newStories as $story) { 
    $newStoryNode = '<idPkg:Story src="Stories/Story_' . $story . '.xml" />'; 
    $insert = new SimpleXMLElement($newStoryNode); 
    $target = current($designMap->xpath('//idPkg:Story[last()]')); 

    simplexml_insert_after($insert, $target); 
} 

function simplexml_insert_after(SimpleXMLElement $insert, SimpleXMLElement $target) 
{ 
    $target_dom = dom_import_simplexml($target); 
    $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true); 
    if ($target_dom->nextSibling) { 
     return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling); 
    } else { 
     return $target_dom->parentNode->appendChild($insert_dom); 
    } 
} 

$designMap->asXML('designmap.xml'); 

Je reçois les avertissements suivants pour chacun des regards:

  1. SimpleXMLElement :: __ construct(): erreur namespace: préfixe Namespace idPkg sur l'histoire est pas définie
  2. SimpleXMLElement :: __construct(): u102.xml
  3. SimpleXMLElement :: __ construct():^dans
+0

Un conseil général: apprendre à utiliser DOMDocument, SimpleXML est tout simplement inutile (et pas si simple) . –

+0

Je travaille sur cette option maintenant. Vous cherchez toujours à cibler l'insertion après le dernier nœud comme le fait la fonction ci-dessus. – Justin

+1

Le langage de balisage InDesign repose principalement sur des espaces de noms spécifiques à Adobe. Lorsque vous instanciez un objet XML à partir du fichier, vous perdez la plupart des informations supplémentaires telles que les espaces de noms et éventuellement les entités déclarées. Ensuite, lorsque vous essayez d'injecter des attributs avec un préfixe, vous obtenez une erreur car le compilateur ne sait même pas d'où vient ce préfixe. C'est à vous de voir comment déclarer et ajouter des espaces de noms à votre objet xml. Sachez que l'écriture du fichier peut entraîner les mêmes problèmes. – Loic

Répondre

0

$xpath->query("//idPkg:Story[last()]")

Je ne sais pas vous devez embrasser la première déclaration "// idPkg: Story"