7
votes

Comment puis-je trouver l'espace de noms d'un élément dans PHP DOM?

Cela ressemble à une question assez facile à répondre, mais je n'ai pas pu le faire fonctionner. Je cours PHP 5.2.6.

J'ai un élément DOM (l'élément racine) qui, quand je vais à $ element-> sauvegardxml (), il diffuse un attribut XMLNS: P>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
...


0 commentaires

3 Réponses :


3
votes

avec PHP 5.2.6 J'ai trouvé 2 façons de cela: xxx

impression xxx

espère que ce que vous avez demandé. :)


4 commentaires

Merci de votre réponse - cela ne résout pas mon problème mais m'incline que cela semble être quelque chose de particulier à des documents chargés de LoadHTML () plutôt que de LoadXML () car votre exemple fonctionne avec LoadXML (). On dirait que LoadHTML crée des documents avec un "espace de noms invisible" qui ne peut pas être lu à l'aide de méthodes DOM mais qui apparaît lorsque vous sauvegardez ().


Je ne suis pas sûr de pouvoir vous suivre à 100% mais que vous chargez quelque chose avec LoadHTML et le redémarrez via Sauvegingxml n'ajoute pas de XMLNS pour moi. Il ajoute simplement / conserve un doctype à partir du HTML. Peut-être que si vous pouvez fournir un peu de script de reproduction à côté de la sortie que vous voulez, je peux creuser plus profondément


Intéressant - ça fait parfois et parfois pas. Si votre document HTML d'entrée a un document XHTML DOCTYPE, il le fait. Il le fera pour cette entrée: w3.org/tr/xhtml1/dtd/xhtml1-truct.dtd ">


Je n'ai aucune idée de la façon dont vous détecteriez cela dans un DOM.



1
votes

Eh bien, vous pouvez le faire avec une fonction comme celle-ci: xxx pré>

Donc, vous le nourrissez un doméploiement, puis il trouve tous les espaces de noms associés: P>

array(2) {
  [0]=>
  string(28) "http://www.w3.org/1999/xhtml"
  [3]=>
  string(22) "http://example.com/bar"
}


0 commentaires

5
votes

Comme Edorian déjà montré , obtenir l'espace de noms fonctionne bien lorsque le balisage est chargé avec loadxml . Mais vous avez raison que cela ne fonctionne pas pour le balisage chargé avec loadhtml : xxx

produira des résultats vides. Mais vous pouvez utiliser xpath xxx

et pour le corps xxx

ou avec noeud de contexte xxx

Mon hypothèse sans éducation est qu'à l'intérieur, un document HTML est différent du document réel . libxml utilise un module différent pour analyser HTML et le DOMDocument lui-même sera de Un NodeType différent, comme vous pouvez simplement vérifier en faisant xxx

avec 13 étant un xml_html_document_node .


2 commentaires

Très bien et détaillé, je ne connaissais pas les Nodeypes en fonction de la méthode d'analyse, mais cela a du sens


Merci pour l'indice des Nodeypes et la capacité d'utiliser XPath - résout beaucoup de mes problèmes!