2017-08-02 5 views
2

Je voudrais analyser un document XML en utilisant XMLReader. J'ai un commutateur de cas avec toutes les constantes. Cependant, si un Tag est à fermeture automatique, XMLReader ne lance que ELEMENT, pas ELEMENT et END_ELEMENT comme prévu.Détection des balises de fermeture automatique XML avec PHP XMLReader

La détection via la propriété de classe $ isEmptyElement ne fonctionne pas non plus car la balise possède des attributs.

Donc ma question: Comment détecter une balise XML à fermeture automatique avec XMLReader en PHP?

connexes, mais pas de solution: XmlReader - Self-closing element does not fire a EndElement event?

Exemple Noeud:

<mynode name="somenamestring" code="intstring" option="intstring3"/> 

Mon code:

$xmlReader->open($url,NULL); 
$xmlWriter = new XMLWriter(); 
$xmlWriter->openMemory(); 
$xmlWriter->startDocument('1.0', 'UTF-8'); 
$xmlWriter->setIndent(true); 
$xmlWriter->setIndentString(' '); 
while ($xmlReader->read()) { 
    switch ($xmlReader->nodeType) { 
     case 1: #element 
      $xmlWriter->startElement($xmlReader->name); 
      if ($xmlReader->hasAttributes) { 
       while ($xmlReader->moveToNextAttribute()) { 
        $xmlWriter->writeAttribute($xmlReader->name,$xmlReader->value); 
       } 
      } 
      if ($xmlReader->isEmptyElement) { 
       $xmlWriter->endElement(); 
      } 
      break; 

     case 3: #text 
      $xmlWriter->text($xmlReader->value); 
      break; 

     case 4: #cdata 
      $xmlWriter->writeCData($xmlReader->value); 
      break; 

     case 14: #whitespace 
      break; 

     case 15: #end element 
      $xmlWriter->endElement(); 
      break; 

     default: 
      print('[WARN] NodeType not in case-switch: '.(string)$xmlReader->nodeType."\n"); 
      break; 
    } 
} 

Répondre

4

Détection par la propriété de classe $ isEmptyElement ne fonctionne pas non plus parce que la La balise a des attributs.

C'est tout simplement faux. Un élément vide avec des attributs est toujours vide et $isEmptyElement reflétera cela. Le problème avec votre code est que vous testez $isEmptyElement après avoir déplacé les attributs. Cela va changer le nœud actuel en un nœud d'attribut qui n'est pas un élément vide. Quelque chose comme ce qui suit devrait fonctionner:

 $isEmpty = $xmlReader->isEmptyElement; 
     if ($xmlReader->hasAttributes) { 
      while ($xmlReader->moveToNextAttribute()) { 
       ... 
      } 
     } 
     if ($isEmpty) { 
      $xmlWriter->endElement(); 
     } 

Ou encore:

 if ($xmlReader->hasAttributes) { 
      while ($xmlReader->moveToNextAttribute()) { 
       ... 
      } 
      $xmlReader->moveToElement(); 
     } 
     if ($xmlReader->isEmptyElement) { 
      $xmlWriter->endElement(); 
     } 
+0

Je serais heureux si tel était le cas, malheureusement pour moi, il retourne false pour le noeud suivant: fixez-vous des options lors de la création du lecteur? Cependant, $ hasValue est vrai mais ce n'est pas utile car il y a beaucoup de balises qui ne se referment pas sans valeur. – Marco

+0

Je veux dire que $ hasValue est faux bien sûr. – Marco

+0

alors je dois faire une autre erreur. J'ai ajouté mon code, pourriez-vous regarder à travers? – Marco